.net 어셈블리 빌드 시 dll 생성

안녕하세요. 또 질문을 올립니다.
지금껏 Visual Studio에서 프로젝트를 만들고 빌드하면 템플릿 형식에 관계없이 일반적으로 어셈블리는 1개가 생성된다고 생각했습니다.
외부 DLL에 종속이 된 프로젝트라면 빌드 시 함께 참조되니 Debug 또는 Release 폴더로 복사될거구요. 닷넷프레임워크 기반 윈도우 응용프로그램 개발자라서 그게 당연한 줄 알았는데 최근 ASP.NET Core MVC를 시작하면서 편견이 깨졌습니다.

ASP.NET Core 는 빌드하면 프로젝트 이름과 같은 이름의 exe 파일과 dll 파일이 생성되었습니다. 또한 .NET 5기반의 Console Application도 프로젝트 명과 같은 이름의 exe파일과 dll 파일이 생성되었습니다. 빌드하는 원리가 달라서 그런건가요?
구글링 해봤지만 아직 검색능력이 부족하여 관련 아티클을 찾지 못했습니다. 도움주시면 감사드리겠습니다.

Windows의 경우 exe파일과 동일한 이름의 dll파일이 생성됩니다.
Linux의 경우 실행 파일과 동일한 이름의 dll파일이 생성됩니다
아마도 .NET Framework이 아닌 .NET Core에서 언제부턴가 이런 방식이 채택된것으로 기억하는데 잘 기억은 안나고요, 어쨌든, 생성된 dll을 dotnet xxx.dll형태로 동일하게 실행할 수 있습니다.
즉, exe파일은 xxx.dll을 실행하는 역할을 합니다.

참고로 csproj파일의 OutputType이 Exe일 경우 dotnet으로 dll을 실행하는 것과 결과가 동일합니다. 그러나, OutputType이 winexe의 경우 EXE로 실행했을 때 콘솔창이 출력되지 않는 차이점이 생깁니다.

부연하자면, 원래 dll이 핵심입니다. .NET Core로 오면서 다중 플랫폼을 지원하는 이유로 실행 파일을 직접 만드는 것이 맞지 않기 때문에 dll로만 출력하는 건데요. 마치 java에서 .class를 생성하기만 하고 실행 파일을 생성하지 않는 것과 같습니다.

단지 그동안 .NET Framework에서 익숙해진, 혹은 윈도우 환경에서 익숙해진 실행 파일로 인해, .NET Core 3.0부터는 개발자가 작성한 코드를 dll에 넣고, 그것을 로드해 실행해 주는 exe를 함께 출력해 줍니다. (그러니까, 편의상 출력해주는 것입니다.)

좋아요 1

아… 닷넷 코어의 윈도우에 종속적인 면을 탈피하고자 채택한 방식이군요… 이해되었습니다. 감사합니다!!

아…winexe라는 것은 처음 보는 키워드네요… 설명 감사드립니다!!