如何查看 C # 编译器生成的 MSIL/CIL? 为什么称它为汇编?

我是新来的。NET C # 编程。我在跟进一些书。据说不是直接将 C # 代码编译成机器代码,而是将其转换成一个中间语言(称为 MSIL 又名 CIL)。但是当我编译时,我得到一个 exe/dll 文件。

  1. 这些 exe/dll 文件中是否包含 MSIL/CIL?
  2. 我想看看那个中间语言代码,感受一下它的存在。我该如何看待它?
  3. 他们将这个 exe/dll 文件称为 assembly。他们使用这个“花哨的词”仅仅是为了将它们与包含本机/机器代码的 exe/dll 文件区分开来吗?
74707 次浏览

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

  1. 是的,它们还包含清单和其他数据,但 CIL 是 exe/dll 的一部分。
  2. 使用 ILDasm反光镜-大多数人会说反射器,因为它是更加强大。两者都将向您展示 CIL 是如何产生的。Wikipedia 有一个所有 CIL 指令的列表,为了更好的感觉(它像是汇编的)。
  3. 我猜它是作为代码的汇编而存在的,这是区分它与本地代码的一个好方法。
  1. 是的,它是在装配。
  2. 你需要 .NET 反射器或者 ILDasm
  3. 更多关于装配检查 给你的详细信息。

由于你正在跟随一些书籍,我将高度推荐你 CLR via C #

  1. 是的,更准确地说是在 PE 文件.text部分(Portable Executable = * 。前任或者 * 。Dll).更多信息可以找到 给你
  2. 最好的选择是使用 ILSpy(反射器不再是免费的)。它是一个免费的反汇编程序,可以反汇编到 MSIL,但也 C # ,VB (在一定程度上)。那个。NET Framework SDK 包含 ILDasm,它是官方的 MSIL 反汇编程序。
  3. 基本上是的。程序集是包含 MSIL 代码和相应元数据的文件。这并不限于 PE 文件本身,但是所有当前的 CLR 实现都使用它们。

如果我可以推荐一本关于这个问题的好书,那就是《专家》。NET 2.0 IL 汇编程序。他是 MSIL 的设计者。

根据我的经验,IL 相关知识的最佳来源是 Andrew Troelsen“ Pro C # and。NET 平台」。从第三版开始,他有真正,真正杰出的章节(大约50页)关于如何理解 IL,甚至编写自己的代码和使用 ILAsm。我利用这些信息来调查多重继承是否存在于。网络世界。你也可以尝试在 IL 中使用一些非常有趣的特性(例如过滤只存在于 VB 中而不存在于 C # 中的异常)。

我强烈建议你阅读这一章。

最终。NET 反射器是一个企业标准的调查 IL 代码的程序集和里希特的书绝对是“必须阅读”的东西。但是从上面提到的其他书中,你可以发现真正有用的东西:)

是的,每次集合。NET 世界持有一些 IL 代码(沿着清单) ,可以通过反射器或 ILDasm 查看。更重要的是,Refector 可以向您展示 C # 和 VB 优化的代码。这意味着任何人都可以查看程序集的源代码,这就是在商业产品中使用模糊处理器的原因。

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

multi-file assembly
(来源: Microsoft.com)

详情请参阅 装配内容

对于 C # 的 片段,我最喜欢的查看 IL 的方法之一是使用免费的 LINQPad 工具。在输入一些代码并选择顶部的“ C # 语句”(或“ C # 程序”,以适合的为准)之后,单击代码输入区域下面的“ IL”按钮,您将看到生成的 IL。

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

我知道这是一个古老的问题,我更喜欢以上任何一种工具。但是,在必要时,至少从2005版开始,VisualStudio 中就有一个 MSIL 查看器。

该工具名为 ildasm.exe,位于默认 VisualStudio 安装后的下列文件夹中:

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

VisualStudio2008 “ 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 库中的“ 如何: 查看程序集内容”。

我想要查看中间语言,尝试下载 从 Telerik 反编译(目前是免费的,但需要注册)。

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

如果你想让它在线,.NET 小提琴是非常好的。只需粘贴你的代码,点击右上角的 View IL选项。

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

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

效果很好!

除此之外,没有可视化工作室集成的第二佳解决方案是 JetBrains dotPeek,说实话,它非常棒。

现在还有另外一个选项。你可以在 VS 代码中使用用 Roslyn 构建的 这个分机来做这件事。这是 目前仅限于.NET 核心

另一种选择: 使用 锐利者

enter image description here 源/IL 同步视图: 左侧蓝色背景线对应于右侧 IL 块

在 Visual Studio 中:

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

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

请参阅“更新帮助”中的 观景中间语言(IL)。上图来自“更新帮助”。

免费选项是使用 Jetbrain dotPeek

另见: “与 ReSharper 和 dotPeek 一起探索中间语言”,作者: Maarten Balliauw,2017年1月19日-Jetbrain 博客

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