在某些特殊情境下我們會想將 .NET dll/exe 反組譯成 CIL,或許是想研究 .NET 編譯行為,或許是要魔改無原始碼程式搞暴力破解。總之,.NET Framework 時代有 IL 反組譯及組譯工具 - ildasm.exeilasm.exe,安裝 Visual Studio 後開個 Developer Command Prompt 就能使用(位於 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools 之類的目錄)。

不過,到 .NET Core / .NET 6+ 時代,要去哪裡找 .NET 6 用的 ildasm 跟 ilasm?好問題。
(LINQPad 有反組譯 IL 功能,但只限程式碼片段)

答案是 - 需透用 NuGet 下載安裝。

我找到兩種做法:

  1. 參照 Microsoft.NETCore.ILDAsm 或 Microsoft.NETCore.ILAsm,編譯時 NuGet 將會依作業系統下載對映版本放在 ~/.nuget/packages/runtime-{Runtime Identifier, RID}/n.0.0/runtimes//native/ildasm:
dotnet add package Microsoft.NETCore.ILDAsm 
dotnet add package Microsoft.NETCore.ILAsm
  1. 依作業系統別參照 runtime.win-x64.Microsoft.NETCore.ILDAsm/ILAdsm,編譯後 ildasm 或 ilasm 會放在 bin/Debug/net6.0/runtimes//native
# Windows x64
dotnet add package runtime.win-x64.Microsoft.NETCore.ILDAsm
# macOS
dotnet add package runtime.osx-arm64.Microsoft.NETCore.ILDAsm
# Linux x64
dotnet add package runtime.linux-x64.Microsoft.NETCore.ILDAsm

試了一下,ildasm/ilasm 也跨平台了,在 Linux 嘛 A 通!

有趣的是,跨平台後的 ildasm/ilasm 依然原汁原味沿用 .NET Framework 版參數語法,使用 /OUT、/UTF8 而非改走 POSIX 參數語法慣例,猜想是舊版程式移植改寫而非重寫,遵循 If it works, don't touch it 鐵律吧! 呵。

Tips of how to install ildasm and ilasm tool for .NET 6+.


Comments

Be the first to post a comment

Post a comment