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


130

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

  1. 这些MSIL / CIL是否包含在这些exe / dll文件中?
  2. 我想看一下中间语言代码。只是为了了解它的存在。怎么看?
  3. 他们称此exe / dll文件为assembly。他们是否使用这个“花哨的单词”只是为了将它们与包含二进制代码(本机代码)的exe / dll文件区分开?

Answers:


95
  1. 是的,更确切地说,.text是在PE文件的部分中(便携式可执行文件= * .exe或* .dll)。在这里可以找到更多信息。
  2. 最好的选择是使用ILSpy(Reflector不再免费)。它是一个免费的反汇编程序,可以将您的程序集分解为MSIL,也可以分解为C#,VB(在某种程度上)。.NET Framework SDK包含ILDasm,这是MSIL的官方反汇编程序。
  3. 基本上是。程序集是一个包含MSIL代码和相应的元数据的文件。这本身并不局限于PE文件,而是所有当前的CLR实现都使用它们。

如果我也可以推荐一本好书,那是Serge Lidin的Expert .NET 2.0 IL汇编器。他是设计MSIL的人。


等待!它不位于.text性爱中吗?如果没有,其中.text包含什么?并且怎么了与#我以为部分被命名为开始.。原来如此.strings

我很好奇,为什么不建议使用ILDasm?它仅包含在(某些版本的?)Visual Studio中吗?
Sinjai

2
两者都有自己的位置,但是对于大多数(> 99.99%)用户而言,ILSpy是正确的选择。它具有将IL代码反编译回C#的能力,对于快速导航和逆向汇编程序而言是无价的。如果您正在做任何会发出原始IL的事情(例如,您正在编写编译器或重写程序集IL,例如使用Mono.Cecil),则ILDasm会派上用场,因为它可以向您显示IL,令牌表等的原始结构。 ,大多数非IL专家都会对这些感到困惑,因此ILSpy可能就是您想要和需要的一切。
约翰内斯·鲁道夫

3
哇,7年后反应迅速!我对IL的了解不多,也没有比较所有选项(这就是为什么我首先要问的问题),但是LINQPad是否没有此反编译功能吗?
Sinjai

我在VS 2017中安装了它,当我单击查看ILSPY中的代码时没有任何反应。
Anirudha Gupta

46

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

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


另一个很好的工具是Reflector的Snippy加载项:jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque 2010年

好一个!我投票赞成,但是如果您必须包括任何自定义类,则要稍微复杂一些。不过,我还是很喜欢这个!
安德鲁·斯蒂兹

28

如果您想在线使用它,.NET Fiddle就是很好的选择。只需粘贴您的代码,然后单击右上角的View IL选项。


2
好像现在被打破了。
卢克·莫雷尔

@nawfal也在这里破裂。我曾经用过。
aloisdg移至codidact.com

但是,还有另一个在线解决方案:sharplab.io。检查此答案以获取更多信息:stackoverflow.com/a/51457583/1248177
aloisdg移至codidact.com

不知道是什么问题,对我来说很好。.@ aloisdgmovingtocodidact.com。那说Sharplab.io看起来很漂亮,谢谢指出:)
nawfal

15

另一个选择:使用ReSharper

在此处输入图片说明 源/ IL同步视图:左蓝色背景线对应于右IL块

在Visual Studio中:

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

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

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

免费选项是使用Jetbrains dotPeek

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


错误地拒绝了您的答案。编辑它以便我
投票



9

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


最好的工具+1
Emad

7

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

  1. 是。它们还包含清单和其他数据,但CIL是exe / dll的一部分。
  2. 使用ILDasmReflector-大多数人会说Reflector,因为它功能更强大。两者都将向您显示CIL产生了什么。Wikipedia列出了所有CIL指令,以使您感觉更好(就像汇编一样)。
  3. 我猜这是作为代码的汇编。区别于本地语言的好方法。


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


2

根据我的经验,与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优化的代码。这意味着任何人都可以查看程序集的源代码,这就是为什么在商业产品中使用混淆器的原因。


2

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

拖入您的DLL,然后IL从顶部的下拉框中选择!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.