.net-core是否有等效的ILDASM / ILASM?
具体来说,我正在寻找在Linux上运行的东西(因此为什么是.net-core)。
答案 0 :(得分:6)
ildasm和ilasm工具都是使用此repo中的CoreCLR构建的:https://github.com/dotnet/coreclr。它们包含与Windows附带的版本类似的功能(无GUI等)。
还提供了包含它们的nuget软件包(https://www.nuget.org/packages?q=ildasm),但它们是特定于平台的,并且还需要使用匹配版本的CoreCLR,因此它们不能通过nuget直接使用。在您的平台上运行这些的最简单方法是从coreclr repo中的源代码构建它们。
答案 1 :(得分:3)
似乎没有一个原生的Microsoft工具在Linux上提供这些功能,并且它目前没有内置在dot-net-core中。
但是,Mono允许装配和反汇编IL代码:
Installation Instructions can be found here.
您正在寻找的是:
ilasm - For assembling
monodis - For disassembling
这些可以在mono-utils包中找到:
e.g。在Debian 8上,我做了以下内容:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian jessie" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
apt-get install mono-devel mono-utils
但是,对于那些试图创建导出的人来说,Mono似乎没有处理x64导出语法。
答案 2 :(得分:2)
让我们使用相关的 nuget 包“安装”ildasm 工具:
dotnet --info
# execution result
..
Runtime Environment:
OS Name: ubuntu
OS Version: 18.04
OS Platform: Linux
RID: ubuntu.18.04-x64 # <----
..
chmod +x ildasm
sudo mv ildasm /usr/share/dotnet/shared/Microsoft.NETCore.App/{version}/
ln -s /usr/share/dotnet/shared/Microsoft.NETCore.App/{version}/ildasm ildasm
./ildasm {path}/project.dll >> {path}/project.il
相同的步骤适用于 ilasm。
作为替代方法,请考虑使用 dotnet-ildasm 工具:
# install .net core runtime if required
# sudo apt-get update; \
# sudo apt-get install -y apt-transport-https && \
# sudo apt-get update && \
# sudo apt-get install -y dotnet-runtime-3.0
# find required tool
dotnet tool search ildasm
# output:
# Package ID Latest Version Authors Downloads Verified
# ---------------------------------------------------------------------------
# dotnet-ildasm 0.12.2 pjbgf 100154
# dotasm 1.0.1 DotAsm 434
# install tool
dotnet tool install -g dotnet-ildasm
输出 IL 到文件:
# go to project folder
cd ../project/bin/Debug/netx.x
dotnet ildasm program.dll -o program.il
答案 3 :(得分:-2)
这不能完全替代其他答案中提到的工具,但是此F#代码段使我能够快速找到AWS Lambda所需的适当类型和函数名称:
open System.Reflection
[<EntryPoint>]
let main argv =
let asm =
argv
|> Array.tryHead
|> Option.map Assembly.LoadFrom
|> Option.defaultWith (Assembly.GetExecutingAssembly)
printfn "%s" asm.FullName
for t in asm.GetTypes () do
printfn " * %s" t.FullName
0