우선 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 Learn
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 라이브러리를 사용하려면 어떻게 해야 베스트일까요?
- WinRT 프로젝트 추가 해서 참조
- WinRT DLL 파일을 obj 폴더(IntermediateOutputPath)에 드래그&드롭 <— “이러면 실제로 될지는 모르겠네요” cf.obj란?: c# - What's the 'obj' directory for in .NET? - Stack Overflow
- WinRT 프로젝트 DLL 파일 생성 및 P/Invoke API로 interop
cf.P/invoke API: Platform Invocation Services - Wikipedia - NuGet 패키지매니저에서 WinRT 라이브러리 설치. ← “best인거같은데 장단점이 혹시 있을까요?”
틀린 부분 지적해주시면 감사하겠습니다.