如何查看 C# 编译器生成的 MSIL / CIL?为啥叫组装?

Posted

技术标签:

【中文标题】如何查看 C# 编译器生成的 MSIL / CIL?为啥叫组装?【英文标题】:How can I view MSIL / CIL generated by C# compiler? Why is it called assembly?如何查看 C# 编译器生成的 MSIL / CIL?为什么叫组装? 【发布时间】:2011-03-20 14:05:20 【问题描述】:

我是 .NET C# 编程的新手。我正在关注几本书。据说不是将 C# 代码直接编译为机器代码,而是将其转换为中间语言(称为 MSIL aka CIL)。但是当我编译时,我得到一个 exe/dll 文件。

    这些 exe/dll 文件中是否包含此 MSIL/CIL? 我想看看中间语言代码,只是为了感受一下它的存在。如何查看? 他们将此 exe/dll 文件称为assembly。他们是否使用这个“花哨的词”只是为了将它们与包含本机/机器代码的 exe/dll 文件区分开来?

【问题讨论】:

ilgenerator.apphb.comgithub.com/max810/IlGenerator 之所以称为程序集,是因为它是 .NET VM 的指令。 JIT 编译的程序在虚拟机中运行,例如 Java 的 JVM、android 的 Dalvik VM 和 .NET 的 CLI VM。 Java 字节码也称为汇编。现在我们有了web assembly,这是一个虚拟机的指令。它是从名为 asm.js 的 JS 子集开发的 【参考方案1】:
    是的,更准确地说是在PE file 的.text 部分(可移植可执行文件= *.exe 或*.dll)。更多信息可以在here找到。 最好的选择是使用ILSpy(Reflector 不再免费)。它是一个免费的反汇编程序,可以将您的程序集反汇编成 MSIL,也可以将 C#、VB(在某种程度上)。 .NET Framework SDK 包含 ILDasm,它是官方的 MSIL 反汇编程序。 基本上是的。程序集是包含 MSIL 代码和相应元数据的文件。这不仅限于 PE 文件本身,所有当前的 CLR 实现都使用它们。

如果我也可以推荐一本关于这个问题的好书,那就是 Serge Lidin 的 Expert .NET 2.0 IL Assembler。他是设计 MSIL 的人。

【讨论】:

等等!它不是位于.textsextion?如果不是,.text 包含什么? # 是怎么回事,我认为部分以 . 开头。所以难道不是.strings 我很好奇,为什么不推荐ILDasm?它是否仅包含在(某些版本?)Visual Studio 中? 两者都有自己的位置,但对于大多数 (> 99.99%) 用户来说,ILSpy 是正确的选择。它能够将 IL 代码反编译回 C#,这对于快速导航和逆向工程程序集非常宝贵。如果您正在做任何会发出原始 IL 的事情(例如,您正在编写编译器或重写程序集 IL,例如使用 Mono.Cecil),那么 ILDasm 会派上用场,因为它可以向您显示 IL 的原始结构、令牌表等。 ,大多数非 IL 专家都会对此感到困惑,因此 ILSpy 可能是您想要和需要的全部。 哇,7 年后的快速响应!我没有过多地使用 IL,也没有比较所有选项(这就是我首先要问的原因),但是 LINQPad 没有这个反编译功能吗? ILSpy 的链接已失效【参考方案2】:

我最喜欢查看 C# 的sn-p IL 的方法之一是使用免费的LINQPad tool。输入一些代码后,选择顶部的“C#语句”(或“C#程序”,取其合适),点击代码输入区下方的“IL”按钮,即可看到生成的IL。

为此使用 LINQPad 比加载 Visual Studio 或从命令行运行编译器,然后加载 ILDASM 并使用文本编辑器打开 .il 文件要方便得多。

【讨论】:

另一个不错的工具是反射器的 Snippy 插件:jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx 不错的一个!我投了赞成票,但如果您必须包含任何自定义类,它会稍微复杂一些。不过,我真的很喜欢这个!【参考方案3】:

如果你想在线,.NET Fiddle 非常好。只需粘贴您的代码,然后单击右上角的View IL 选项。

【讨论】:

现在好像坏了。 @nawfal 也打破了这里。我以前用过。 不过还有另一个在线解决方案:sharplab.io。查看此答案以获取更多信息:***.com/a/51457583/1248177 不确定是什么问题,对我来说很好用.. @aloisdgmovingtocodidact.com。也就是说,sharplab.io 看起来很漂亮,感谢您指出:)【参考方案4】:

另一种选择:使用 ReSharper

Source / IL 同步视图:左侧蓝色背景线对应右侧 IL Block

在 Visual Studio 中:

选择 ReSharper |窗户 | IL 查看器 或上下文菜单:导航 | IL 代码

支持源代码和 IL 的同步视图 - 当您单击源代码中的语句时,IL 中的相应块会突出显示(反之亦然)。显示来自 Microsoft Developer Network 的 IL 和来自 ECMA 标准规范的“通用中间语言 (CIL) 指令集”的描述。

请参阅 Resharper 帮助中的 Viewing Intermediate Language (IL)。上图来自 Resharper 帮助。

免费选项是使用Jetbrains dotPeek

另请参阅:“使用 ReSharper 和 dotPeek 探索中间语言 (IL)”,作者 Maarten Balliauw,2017 年 1 月 19 日 - Jetbrains Blog

【讨论】:

错误地否决了您的答案。编辑它,以便我可以投票 ReSharper 中的 IL 查看器非常棒。如果将鼠标悬停在 IL 语法上,它会显示描述性工具提示,解释每个关键字的作用。非常适合刚接触 IL 的人!【参考方案5】:

我相信它们被称为“程序集”,因为程序集是一组模块,由清单组装在一起。

(来源:microsoft.com)

详情请见Assembly Contents。

【讨论】:

【参考方案6】:

sharplab 是一个在线工具,非常适合简单的用例。在左侧输入您的代码,IL 显示在右侧。

【讨论】:

有史以来最好的工具 +1 这个工具也懂.Net 5,太好了【参考方案7】:
    是的,它正在组装中。 您需要.NET Reflector 或ILDasm。 有关装配检查的更多详细信息HERE。

P.S 当你在看一些书时,我强烈推荐你CLR via C#。

【讨论】:

【参考方案8】:

在许多方面,.NET 程序集类似于 Java 字节码包。

    是的。它们还包含清单和其他数据,但 CIL 是 exe/dll 的一部分。 使用ILDasm 或Reflector - 大多数人会说Reflector,因为它更强大。两者都会向您展示产生了什么 CIL。***有一个所有CIL instructions 的列表,为了更好的感觉(它类似于汇编)。 我猜它是作为代码的汇编。将其与原生产品区分开来的好方法。

【讨论】:

【参考方案9】:

我刚刚花了几个小时寻找可以让我直接在 Visual Studio 中查看 IL 代码的最佳工具。

目前我找到的唯一解决方案是 Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

效果很好!

否则,第二好的解决方案是 JetBrains dotPeek,但没有集成 Visual Studio,老实说,这非常棒。

【讨论】:

【参考方案10】:

我知道这是一个老问题,我更喜欢上面的任何工具。但是,在紧要关头,至少从 2005 版开始,Visual Studio 的盒子中就有一个 MSIL 查看器。

该工具名为 ildasm.exe,在默认 Visual Studio 安装后位于以下文件夹中:

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

有关详细信息,请参阅:MSDN 库中的“How to: View Assembly Contents”。

【讨论】:

【参考方案11】:

根据我的经验,最好的 IL 相关知识来源是 Andrew Troelsen “Pro C# 和 .NET 平台”。从第 3 版开始,他有关于如何理解 IL 甚至编写自己的代码和使用 ILAsm 的非常非常出色的章节(大约 50 页)。我利用这些信息来调查 .NET 世界中是否存在多重继承。您也可以尝试在 IL 中使用一些非常有趣的功能(例如过滤仅存在于 VB 但不存在于 C# 中的异常)。

我强烈推荐阅读那一章。

最终,.NET Reflector 是研究 IL 程序集代码的企业标准,Richter 的书绝对是“必读”的东西。但是从上面提到的其他书籍中,您可以揭示真正有用的东西:)

是的,.NET 世界中的每个程序集都包含一些 IL 代码(与清单一起),可以通过 Reflector 或 ILDasm 查看。更重要的是,Reflector 可以向您展示 C# 和 VB 优化的代码。这意味着任何人都可以查看程序集的源代码,这就是为什么在商业产品中使用混淆器的原因。

【讨论】:

【参考方案12】:

我要查看中间语言,尝试下载JustDecompile from Telerik(目前免费,但需要注册)。

拖入您的 DLL 并从顶部的下拉框中选择 IL

【讨论】:

【参考方案13】:

现在有另一种选择。您可以在 VS Code 中使用由 Roslyn 构建的 this extension 执行此操作。这是currently limited to .NET Core。

【讨论】:

以上是关于如何查看 C# 编译器生成的 MSIL / CIL?为啥叫组装?的主要内容,如果未能解决你的问题,请参考以下文章

通用中间语言(CIL)

学习 CIL (MSIL) 的最佳资源是啥

Mono为何能跨平台?聊聊CIL(MSIL)

使用MSIL采用Emit方式实现C#的代码生成与注入

CIL nop 操作码的目的是啥?

.NET框架认识