7

了解 CIL 有什么好处?

您必须了解汇编才能理解它吗?这些文件中的代码看起来很相似。

我如何进一步了解它?任何关于它的书,比如 Jon Skeet 的 C# 书?

4

5 回答 5

6

了解 CIL 可以让您在某些边缘情况下更充分地利用 .NET 框架

请注意,您不必能够读取原始操作码即可从这些知识中受益。IL和程序集的通用知识,再加上Mono.Cecil.dll可以创造奇迹:

PS:对我来说,获得一些实用的 IL 知识的最佳来源方法是阅读一些宪兵规则的 C# 代码(它类似于 FxCop,使用 Mono.Cecil 进行代码自省)。此外,这篇文章是一个好的开始:Parsing the IL of a Method Body

于 2009-02-11T19:48:38.273 回答
6

我发现这些书在学习 IL 和 CLR 时很有用:

只是阅读它们会给你很多信息。

(我也听说CLR via C#非常好,但我自己没有读过。)

当您遇到问题时,了解 IL 和 CLR 将为您提供帮助。(一个泄漏的抽象?)虽然,现在有了像 Reflector 这样的很好的反编译器,我发现自己使用 ildasm 的次数并不多。

不一定需要了解组装,但它会有所帮助。在大多数情况下,IL 实际上非常简单。

IL 派上用场的一个例子是确定 F# 究竟如何编译某些结构。另一个是能够使用 DynamicMethod 和 System.Reflection.Emit,这可以在某些情况下打开一些很好的解决方案。

于 2009-02-11T18:11:01.643 回答
3

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。

于 2009-02-11T20:00:34.470 回答
2

您不必了解汇编即可学习它 - 它与本机汇编完全分开。虽然在运行时,CLR 基本上会将其转为原生程序集。

几个可能的优点:

1)您可以查看编译器输出的 CIL,并具体查看您的代码在做什么

2)为了解决某些类型的问题,您可能在某些时候想要动态生成代码......例如,由于 Microsoft 的策略注入器框架还不够成熟,而且我们需要这种类型的行为,所以我们编写了一些低级的框架类型管道。

于 2009-02-11T18:04:59.817 回答
0

您可能可以使用 CIL 做一些事情,但我想不出一个实际的例子。无论如何,这里有一个教程:

http://weblogs.asp.net/kennykerr/archive/2004/09/07/introduction-to-msil-part-1-hello-world.aspx

于 2009-02-11T18:03:59.650 回答