如何在 .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?的主要内容,如果未能解决你的问题,请参考以下文章

net框架运行原理

如何在 Linux 上运行 .Net 核心 WinForms 应用程序

.NET IL学习笔记

拆卸时.net图标丢失[重复]

.NET Framework基础

IL指令大全