如何在 .Net 核心 exe/程序集上运行 ildasm?
Posted
技术标签:
【中文标题】如何在 .Net 核心 exe/程序集上运行 ildasm?【英文标题】:How to run ildasm on .Net core exe/assembly? 【发布时间】:2020-05-06 04:07:44 【问题描述】:我正在尝试针对 .NetCore3.1 控制台应用运行作为 Visual Studio 2019 的一部分安装的 ildasm(中间语言反汇编程序)。
使用 Visual Studio 2019 的 Developer 命令提示符并运行以下命令
ildasm.exe D:\DotNet\IntroductionToCsharp\IntroductionToCsharp\bin\Debug\netcoreapp3.1\IntroductionToCsharp\bin\Debug\netcoreapp3.1\IntroductionToCsharp.exe
但出现以下错误:
'D:\DotNet\IntroductionToCsharp\IntroductionToCsharp\bin\Debug\netcoreapp3.1\ IntroductionToCsharp.exe'没有有效的CLR头,不能反汇编
注意:在非核心 (.Net Framework 4.x) exe 上运行相同的命令可以正常工作。也许在 .Net Core 中查看 IL 需要一些特别的东西?
【问题讨论】:
您是否忘记添加 .dll 扩展名? 我添加了扩展 .exe 但仍然没有运行 .NETCore 应用的构建方式非常不同,.exe 文件是 host。你的代码被编译成.dll,你可以反汇编。 或者简单地说,那个.exe文件相当于dotnet.exe,所以它是一个本机可执行文件,而不是.NET程序集。 【参考方案1】:正如已经指出的那样,.NET Core 中的 .exe
只不过是一个主机。它的唯一目的是加载 CoreCLR,然后 JIT 编译并执行程序集的 Main 方法。代码本身存储在.dll
中。您可以使用您最喜欢的反汇编程序(ILDASM、JetBrains 的 dotPeek、ILSpy 等)进行检查。
为什么 IL 反汇编程序可以针对 .NET Framework 中的 .exe
工作?因为可执行文件将是一个托管程序集,具有相应的托管标头。与 .NET Core 不同,.NET Framework 从 Windows 操作系统的 Image Loader 获得广泛支持,可以设置所有内容,然后在可执行文件中运行托管代码。请参阅here 讨论的第二点。
【讨论】:
【参考方案2】:注意:netcore 中的 EXE 仅适用于“windows 用户”,您应该始终使用 dll
See here
您可以对 netcore 程序集 (dll) 尝试以下步骤:
1 你需要在你的 dll netcore 的同一个文件夹中拥有 coreclr
2(在命令行VS中运行命令)
ildasm.exe /all /out:<path to output>.il <path to dll>.dll
【讨论】:
【参考方案3】:您应该将 ildasm 指向您的程序集文件(.dll 或 .exe)而不是您的项目文件夹 例如。
ldasm.exe D:\DotNet\IntroductionToCsharp\IntroductionToCsharp\bin\Debug\netcoreapp3.1\IntroductionToCsharp.exe
【讨论】:
对不起,我不明白,请评论你说的命令,谢谢 D:\DotNet\IntroductionToCsharp\IntroductionToCsharp\bin\Debug\netcoreapp3.1\IntroductionToCsharp 这是我有汇编文件的路径。但仍然出现错误 程序集文件没有扩展名?您可能只需要在命令中添加扩展名(.exe 或 .dll) 我提供了.exe扩展名但仍然出现错误先生,请建议我一些解决方案谢谢 你能显示文件夹内容和你尝试的最新命令吗?以上是关于如何在 .Net 核心 exe/程序集上运行 ildasm?的主要内容,如果未能解决你的问题,请参考以下文章