빌드할 때 dll(어셈블리)은 어떻게 가져오죠?

우선 System.dll 파일은 어디에 있을까요?
경로를 한번 찾아봤습니다.

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\CoreCon\Binaries\Phone Tools\Debugger\CoreClr\arm64
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\LiveShare\Agent

C:\Program Files (x86)\MSBuild\15.0.Net.NetNative\15.0.24211\arm\ilc\lib\Facades
C:\Program Files (x86)\MSBuild\15.0.Net.NetNative\15.0.24211\x64\ilc\lib\Facades
C:\Program Files (x86)\MSBuild\15.0.Net.NetNative\15.0.24211\x86\ilc\lib\Facades

C:\Windows\Microsoft.NET\Framework\v4.0.30319
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
C:\Windows\Microsoft.NET\Framework\v2.0.50727
C:\Windows\Microsoft.NET\Framework64\v2.0.50727
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089

C:\Windows\WinSxS\amd64_system_b77a5c561934e089_4.0.15805.320_none_2d6125890227b7fb
C:\Windows\WinSxS\amd64_system_b77a5c561934e089_4.0.15805.0_none_3595566d47213bb8
C:\Windows\WinSxS\amd64_netfx-system_b03f5f7f11d50a3a_10.0.19041.1_none_abbbded0d22c5c20
C:\Windows\WinSxS\msil_system_b77a5c561934e089_10.0.19041.1_none_9b78698aecf8304b

C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089

버전마다, 플랫폼마다, 경로가 다르고 실제로도 내용도 다를 것 같습니다만,
각 컴파일러(csc.exe 등)가 system.dll을 참조하기 위해서 위 경로들을 탐색한다고 볼 수 있을까요?

예를 들어보죠.
.Net.Framework의 컴파일러인 csc.exe에게
아래 소스를 exe파일로 컴파일 시켜보겠습니다.
cf. 레퍼런스 : 처음부터 MSBuild 프로젝트 파일 만들기 - MSBuild | Microsoft Docs

using System;

class HelloWorld
{
    static void Main()
    {
#if DebugConfig
    Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION");
#endif

    Console.WriteLine("Hello, world!");
    }
}

‘using System;’ 구문을 보고 Framework 컴파일러는

C:\Windows\Microsoft.NET\Framework\v4.0.30319
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
C:\Windows\Microsoft.NET\Framework\v2.0.50727
C:\Windows\Microsoft.NET\Framework64\v2.0.50727
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089

버전에 맞는 자신의 경로의 System.dll 을 참조해서 exe파일을 생성합니다.

이 가정이 맞다면 궁금한 점이 하나 있습니다.
.Net Core 5 가 WinRT 라이브러리를 따로 분리시켰잖아요?
그러면 .Net Core 5는 자기 컴파일러 경로에 WinRT 관련 어셈블리(DLL)들이 없으니까
using Windows.Media; 같은 구문을 사용할 수 없겠네요.
맞나요?

그러면 이런 상황에서 .Net Core 5 솔루션에서 WinRT 라이브러리를 사용하려면 어떻게 해야 베스트일까요?

  1. WinRT 프로젝트 추가 해서 참조
  2. WinRT DLL 파일을 obj 폴더(IntermediateOutputPath)에 드래그&드롭 <— “이러면 실제로 될지는 모르겠네요” cf.obj란?: c# - What's the 'obj' directory for in .NET? - Stack Overflow
  3. WinRT 프로젝트 DLL 파일 생성 및 P/Invoke API로 interop
    cf.P/invoke API: Platform Invocation Services - Wikipedia
  4. NuGet 패키지매니저에서 WinRT 라이브러리 설치. ← “best인거같은데 장단점이 혹시 있을까요?”

틀린 부분 지적해주시면 감사하겠습니다.

좋아요 1

MSBuild에서 csproj의 Project SDKTargetFramework에 의해 포함할 DLL을 결정합니다. 아래의 글을 참고하세요.

dotnet --info 를 통해 SDK 및 런타임의 경로를 확인할 수 있고요,

예를 들어,
Project의 SDK 지정에 따라, C:\Program Files\dotnet\sdk\[version]\Sdks의 SDK가 선택이 되는 식입니다.

아래의 링크를 통해 원하시는 거의 대부분을 이해할 수 있을 것 같습니다.

WinRT를 접근하는 방법은,

TFM(대상 프레임워크 모니커) 방식을 통해 사용할 수 있습니다.

더 자세한 내용은 이글을 참고 바래요.

좋아요 3

감사합니다 ! 정독해보고 다시 질문드리겠습니다 :smile:

좋아요 1