了解 CIL 有什么好处?
您必须了解汇编才能理解它吗?这些文件中的代码看起来很相似。
我如何进一步了解它?任何关于它的书,比如 Jon Skeet 的 C# 书?
了解 CIL 可以让您在某些边缘情况下更充分地利用 .NET 框架。
请注意,您不必能够读取原始操作码即可从这些知识中受益。IL和程序集的通用知识,再加上Mono.Cecil.dll可以创造奇迹:
PS:对我来说,获得一些实用的 IL 知识的最佳来源方法是阅读一些宪兵规则的 C# 代码(它类似于 FxCop,使用 Mono.Cecil 进行代码自省)。此外,这篇文章是一个好的开始:Parsing the IL of a Method Body。
我发现这些书在学习 IL 和 CLR 时很有用:
在 IL 汇编器内部, Serge Lidin
为 .NET 公共语言运行时编译,John Gough
当然,您还需要ECMA 规范。
只是阅读它们会给你很多信息。
(我也听说CLR via C#非常好,但我自己没有读过。)
当您遇到问题时,了解 IL 和 CLR 将为您提供帮助。(一个泄漏的抽象?)虽然,现在有了像 Reflector 这样的很好的反编译器,我发现自己使用 ildasm 的次数并不多。
不一定需要了解组装,但它会有所帮助。在大多数情况下,IL 实际上非常简单。
IL 派上用场的一个例子是确定 F# 究竟如何编译某些结构。另一个是能够使用 DynamicMethod 和 System.Reflection.Emit,这可以在某些情况下打开一些很好的解决方案。
CIL 比常规汇编程序 imo 简单得多。这在很大程度上是由于虚拟机是基于堆栈的,所以所有内容都进入堆栈并且没有要跟踪的寄存器。
也没有偏移计算,没有直接的内存操作,方法调用使用它们的 .NET 名称列出等等。我猜如果你对任何其他类型的汇编语言有一点经验,你可能会很快掌握 CIL 代码的要点。
就我个人而言,我发现能够启动 ILDasm 或 Reflector 以查看 C# 编译器实际为某些代码生成的 IL 非常有用。对于许多较新的功能,例如匿名委托/lambda、捕获的变量、迭代器等,检查 IL 可能非常有帮助。
其他人提到了好书,我将投票给Serge Lidin的Expert .NET 2.0 IL 汇编程序。它有所有血腥的细节。如果您想要更接近 C# Jeffrey Ricther通过 C# 的 CLR的东西,那就太好了。Jon Skeet 的书很棒,但它并没有真正涵盖 CIL。
您不必了解汇编即可学习它 - 它与本机汇编完全分开。虽然在运行时,CLR 基本上会将其转为原生程序集。
几个可能的优点:
1)您可以查看编译器输出的 CIL,并具体查看您的代码在做什么
2)为了解决某些类型的问题,您可能在某些时候想要动态生成代码......例如,由于 Microsoft 的策略注入器框架还不够成熟,而且我们需要这种类型的行为,所以我们编写了一些低级的框架类型管道。
您可能可以使用 CIL 做一些事情,但我想不出一个实际的例子。无论如何,这里有一个教程:
http://weblogs.asp.net/kennykerr/archive/2004/09/07/introduction-to-msil-part-1-hello-world.aspx