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

我是.NET C#编程的新手。 我正在跟着几本书。 有人说,而不是直接编译为二进制代码(本机代码)。 高级代码被转换成中间语言(称为MSIL又名CIL)。 但是当我编译时,我得到一个exe / Dll文件。

  1. 这个MSIL / CIL包含在这些EXE / DLL文件?
  2. 我想看看中间语言代码。 只是为了感受它的存在。 如何查看?
  3. 他们正在调用这个exe / dll文件一个assembly 。 他们是否使用这个“花哨的词”只是为了区分这些从包含二进制代码(本地代码)的exe / dll文件?
  1. 是的,更确切地说在PE文件的.text部分(portable executable = * .exe或* .dll)。 更多信息可以在这里find。
  2. 最好的select是使用ILSpy (Reflector不再免费)。 这是一个免费的反汇编程序,可以拆卸你的程序集到MSIL,但也C#,VB(在某种程度上)。 .NET Framework SDK包含ILDasm,它是官方的MSIL编译器。
  3. 基本上是的。 程序集是一个包含MSIL代码和相应元数据的文件。 这不仅限于PE文件本身,但所有当前的CLR实现都使用它们。

如果我也可以推荐一本好书,那就是Serge Lidin的Expert .NET 2.0 IL Assembler。 他是deviseMSIL的人。

我最喜欢的方式之一,看看IL的C# 片段是使用免费的LINQPad工具 。 input一些代码并在顶部(或“C#程序”中select“C#语句”,select合适的代码),单击代码input区域下的“IL”button,您将看到生成的IL。

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

如果你想在网上, .NET的小提琴是非常好的。 只需粘贴您的代码,然后点击右上angular的View IL选项。

  1. 是的,它在组装。
  2. 您需要.NET Reflector或ILDasm 。
  3. 更多细节汇编检查在这里 。

PS当你正在关注一些书籍时,我将强烈推荐你通过C#编写CLR 。

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

多文件程序集http://i.msdn.microsoft.com/dynimg/IC125851.gif

有关详细信息,请参阅组装内容

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

  1. 是。 它们还包含清单和其他数据,但是CIL是exe / dll的一部分。
  2. 使用ILDasm或reflection器 – 大多数人会说reflection器,因为它更强大。 两者都会告诉你什么是CIL的产生。 维基百科有一个所有CIL指令的列表,为了更好的感觉(这是组装像)。
  3. 我想这是作为一个代码集合的意思。 一个很好的方式来区分它与本地。

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

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

它工作得很好!

否则,第二个最好的解决scheme,但没有视觉工作室整合,是JetBrains dotPeek,这是相当真棒的说实话。

我知道这是一个老问题,我更喜欢上面的任何工具。 但是,至less从版本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 Library中的“ 如何查看程序集内容 ”。

根据我的经验,与IL有关的知识的最佳来源是Andrew Troelsen“Pro C#和.NET平台”。 从第三版开始,他就有关如何理解IL甚至编写自己的代码和使用ILAsm的真正非常杰出的章节(约50页)。 我已经使用这些信息来调查在.NET世界中是否存在多重inheritance。 您也可以尝试在IL中使用一些非常有趣的function(例如,过滤只存在于VB中但不在C#中的exception)。

我强烈build议阅读该章节。

最后,.NET Reflector是用于调查程序集IL代码的企业级标准,Richter的书肯定是“必读”的东西。 但从上面提到的其他书籍,你可以揭示真正有用的东西:)

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

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

拖动你的DLL,并从顶部的下拉框中selectIL

另一个select:使用ReSharper

在这里输入图像说明 Source / IL同步视图:左侧蓝色背景线对应右侧IL Block

在Visual Studio中:

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

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

请参阅Resharper帮助中的查看中间语言(IL) 。 以上图片来自Resharper帮助。

免费select是使用Jetbrains dotPeek

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

现在有另一种select。 你可以在VS Code中用Roslyn构build这个扩展 。 这目前仅限于.NET Core 。