최신 버전의 ilasm.exe/ildasm.exe 사용하는 방법
지난 글에서,
ilasm.exe 컴파일 오류 - error : syntax error at token '-' in ... -inf
; https://www.sysnet.pe.kr/2/0/13260
.NET Framework의 ildasm.exe가 "-inf" 토큰을 임의로 사용하는 문제가 있었는데요, 혹시 IL(Intermediate Language) 문법이 발전했던 것이 아닐까요? ^^
그래서, .NET Core/5+와 함께 빌드된 ilasm을 구해봤습니다. 이게 방법이 좀 묘한데요, 우선 대표(?) 패키지는 Microsoft.NETCore.ILAsm입니다.
Microsoft.NETCore.ILAsm
; https://www.nuget.org/packages/Microsoft.NETCore.ILAsm
하지만 이 패키지가 설치된 디렉터리를 확인해 보면,
// Install-Package Microsoft.NETCore.ILAsm
C:\> dir /b "%USERPROFILE%\.nuget\packages\microsoft.netcore.ilasm\7.0.0"
.nupkg.metadata
.signature.p7s
Icon.png
LICENSE.TXT
microsoft.netcore.ilasm.7.0.0.nupkg
microsoft.netcore.ilasm.7.0.0.nupkg.sha512
microsoft.netcore.ilasm.nuspec
runtime.json
THIRD-PARTY-NOTICES.TXT
보는 바와 같이 바이너리가 없습니다. 검색해 보면,
Where is ilasm.exe in Microsoft.NETCore.ILAsm?
; https://stackoverflow.com/questions/45818560/where-is-ilasm-exe-in-microsoft-netcore-ilasm
"runtime.json" 파일에 각각의 플랫폼에 해당하는 패키지가 있다고 나옵니다.
{
"runtimes": {
// ...[생략]...
"win-x64": {
"#import": [],
"Microsoft.NETCore.ILAsm": {
"runtime.win-x64.Microsoft.NETCore.ILAsm": "[7.0.0, )"
}
},
"win-x86": {
"#import": [],
"Microsoft.NETCore.ILAsm": {
"runtime.win-x86.Microsoft.NETCore.ILAsm": "[7.0.0, )"
}
}
}
}
그러니까, 윈도우에서 실행할 ilasm.exe를 구하고 싶다면 runtime.win-x64.Microsoft.NETCore.ILAsm 패키지를 설치하면 되는 것입니다.
runtime.win-x64.Microsoft.NETCore.ILAsm
; https://www.nuget.org/packages/runtime.win-x64.Microsoft.NETCore.ILAsm
근데, dotnet tool과 같은 형식이 아니라서 어쨌든 더미 프로젝트라도 하나 생성해 패키지 참조 추가를 해야 합니다.
Install-Package Microsoft.NETCore.ILAsm
Install-Package runtime.win-x64.Microsoft.NETCore.ILDAsm
그럼 아래의 디렉터리에 생성되는데,
[ilasm.exe]
%USERPROFILE%\.nuget\packages\runtime.win-x64.microsoft.netcore.ilasm\7.0.0\runtimes\win-x64\native
[ildasm.exe]
%USERPROFILE%\.nuget\packages\runtime.win-x64.microsoft.netcore.ildasm\7.0.0\runtimes\win-x64\native
어차피 빈 프로젝트 생성했으니 그걸 빌드하면 디렉터리의 .\runtimes\win-x64\native 하위에서 ilasm.exe를 찾을 수 있습니다.
그리고, 위와 마찬가지의 방법으로 ildasm.exe도 구할 수 있습니다.
runtime.win-x64.Microsoft.NETCore.ILDAsm
; https://www.nuget.org/packages/runtime.win-x64.Microsoft.NETCore.ILDAsm
혹은, 어차피 dotnet이 있으니까, 그냥 아래의 4개 명령어를 실행하는 것도 나쁘진 않겠습니다. ^^
c:\temp\testapp> dotnet new console
c:\temp\testapp> dotnet add package runtime.win-x64.Microsoft.NETCore.ILAsm
c:\temp\testapp> dotnet add package runtime.win-x64.Microsoft.NETCore.ILDAsm
c:\temp\testapp> dotnet build
/*
C:\temp\testapp\bin\Debug\net7.0\runtimes\win-x64\native\ilasm.exe
C:\temp\testapp\bin\Debug\net7.0\runtimes\win-x64\native\ildasm.exe
%USERPROFILE%\.nuget\packages\runtime.win-x64.microsoft.netcore.ilasm\7.0.0\runtimes\win-x64\native\ilasm.exe
%USERPROFILE%\.nuget\packages\runtime.win-x64.microsoft.netcore.ildasm\7.0.0\runtimes\win-x64\native\ildasm.exe
*/
자... 이렇게 최신 버전의 ilasm/ildasm을 구했는데요, 과연 IL 언어에 새로운 토큰이 추가된 것이었는지,
지난번 예제를 빌드한 DLL에 대해 ildasm.exe를 해보면,
.method assembly hidebysig static float64
'<<Main>$>g__GetResult|0_0'() cil managed
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 15 (0xf)
.maxstack 1
.locals init (float64 V_0)
IL_0000: nop
IL_0001: ldc.r8 (00 00 00 00 00 00 F0 FF)
IL_000a: stloc.0
IL_000b: br.s IL_000d
IL_000d: ldloc.0
IL_000e: ret
} // end of method Program::'<<Main>$>g__GetResult|0_0'
-inf 토큰을 사용하지 않고 있습니다. ^^ 음... 결국 .NET Framework 버전에서 발생한 버그(?) 정도에 불과한 것이었다는!
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]