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

121 .net c# assemblies

我是.NET C#编程的新手.我跟着几本书.据说不是直接将其编译为二进制代码(Native code).高级代码转换为中间语言(称为MSIL aka CIL).但是当我编译时,我得到一个exe/Dll文件.

  1. 这些exe/dll文件中是否包含此MSIL/CIL?
  2. 我想看看那个中间语言代码.只是为了感受它的存在.怎么看?
  3. 他们正在调用这个exe/dll文件assembly.他们使用这个"花哨的词"只是为了区分这些包含二进制代码(本机代码)的exe/dll文件吗?

Joh*_*lph 91

  1. 是的,更准确地说.text是在PE文件的部分(portable executable =*.exe或*.dll).更多信息可以在这里找到.
  2. 最好的选择是使用ILSpy(Reflector不再免费).它是一个免费的反汇编程序,可以将你的程序集拆分成MSIL,还可以将C#,VB(在某种程度上)拆分..NET Framework SDK包含ILDasm,它是官方的MSIL dissasembler.
  3. 基本上是的.程序集是包含MSIL代码和相应元数据的文件.这不仅限于PE文件本身,但所有当前的CLR实现都使用它们.

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

  • 哇,7年后迅速回应!我没有太多搞乱IL,或者比较了所有选项(这就是我首先要问的原因),但是LINQPad没有这个反编译功能吗? (3认同)
  • 两者都有自己的位置,但对于大多数(> 99.99%)用户来说,ILSpy 是正确的选择。它将 IL 代码反编译回 C# 的能力对于快速导航和逆向工程程序集非常宝贵。如果您正在做任何会发出原始 IL 的事情(例如,您正在编写编译器或重写程序集 IL,例如使用 Mono.Cecil),那么 ILDasm 会派上用场,因为它可以向您显示 IL 的原始结构、标记表等。再次,大多数非 IL 专家都会被这些混淆,所以 ILSpy 可能就是你想要和需要的。 (2认同)
  • ILSpy 的链接已失效 (2认同)

Mar*_*off 46

我最喜欢看IL的一个C#片段的方法之一就是使用免费的LINQPad工具.输入一些代码并在顶部选择"C#语句"(或"C#程序",无论哪个适合),单击代码输入区域下的"IL"按钮,您将看到生成的IL.

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


naw*_*fal 26

如果你想在线,.NET Fiddle非常棒.只需粘贴代码并点击右上角的View IL选项即可.

  • 现在好像坏掉了。 (3认同)
  • 不过,还有另一个在线解决方案:https://sharplab.io。检查此答案以获取更多信息:/sf/answers/3602030841/ (2认同)

Col*_*lin 13

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


Inc*_*ito 12

  1. 是的,它是在集会中.
  2. 您需要.NET ReflectorILDasm.
  3. 关于装配的更多细节请点击这里.

PS当你读一些书时,我会强烈推荐你通过C#CLR.


Mic*_*rux 12

另一种选择:使用ReSharper

在此输入图像描述 源/ IL同步视图:左蓝色背景线对应右IL块

在Visual Studio中:

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

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

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

免费选项是使用Jetbrains dotPeek

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


Joh*_*ers 11

我相信它们被称为"组件",因为组件是一组模块,由清单组装在一起.

多文件组装http://i.msdn.microsoft.com/dynimg/IC125851.gif

有关详细信息,请参见组件


Ode*_*ded 7

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

  1. 是.它们还包含清单和其他数据,但CIL是exe/dll的一部分.
  2. 使用ILDasmReflector - 大多数人会说Reflector,因为它更强大.两者都将向您展示CIL的产生方式.维基百科有一个所有CIL指令的列表,以获得更好的感觉(它就像汇编一样).
  3. 我猜这是一个代码集.一种区别于本机的好方法.


seb*_*bas 7

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

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

它运作得很好!

否则,第二个最好的解决方案,但没有视觉工作室集成,是JetBrains dotPeek,说实话真是太棒了.


Eri*_*ham 5

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