【发布时间】:2009-02-11 17:57:07
【问题描述】:
了解 CIL 有什么好处?
你必须了解汇编才能理解它吗?这些文件中的代码看起来很相似。
如何了解更多信息?有没有像 Jon Skeet 的 C# 书这样的书?
【问题讨论】:
-
不是这个问题主要是关于学习它的好处。
了解 CIL 有什么好处?
你必须了解汇编才能理解它吗?这些文件中的代码看起来很相似。
如何了解更多信息?有没有像 Jon Skeet 的 C# 书这样的书?
【问题讨论】:
我发现这些书在学习 IL 和 CLR 时很有用:
Inside the IL Assembler, 塞尔吉·利丁
当然,你会想要ECMA specs。
只要通读它们就会给你很多信息。
(我也听说CLR via C#很好,但我自己没看过。)
当您遇到问题时,了解 IL 和 CLR 将助您一臂之力。 (一个泄漏的抽象?)虽然,现在有了像 Reflector 这样的很好的反编译器,我发现自己使用 ildasm 的次数并不多。
不一定需要了解汇编,但它会有所帮助。在大多数情况下,IL 实际上非常简单。
IL 派上用场的一个例子是确定 F# 究竟如何编译某些结构。另一个是能够使用 DynamicMethod 和 System.Reflection.Emit,这可以在某些情况下开辟一些不错的解决方案。
【讨论】:
了解 CIL 可以让您在某些边缘情况下充分利用 .NET 框架。
请注意,您不必能够阅读原始操作码即可从这些知识中受益。 IL和程序集的通用知识,加上Mono.Cecil.dll可以创造奇迹:
PS:对我来说,获得一些实用 IL 知识的最佳来源方法是阅读 C# 代码以了解一些 Gendarme 规则(它是 FxCop 的类似物,使用 Mono.Cecil 进行代码自省)。此外,这篇文章是一个好的开始:Parsing the IL of a Method Body。
【讨论】:
CIL 比普通的汇编程序 imo 简单得多。这在很大程度上是由于虚拟机是基于堆栈的,所以所有内容都进入堆栈并且没有需要跟踪的寄存器。
也没有偏移计算,没有直接的内存操作,方法调用使用它们的 .NET 名称列出等等。我想如果你对任何其他类型的汇编语言有一点经验,你可能会很快掌握 CIL 代码的要点。
我个人认为能够启动 ILDasm 或 Reflector 以查看 C# 编译器为某些代码实际生成的 IL 非常有用。对于许多较新的功能,例如匿名委托/lambda、捕获的变量、迭代器等,检查 IL 可能非常有帮助。
其他人都提到了好书,我将投票给 Serge Lidin 的Expert .NET 2.0 IL assembler。它有所有血腥的细节。如果您想要更接近 C# 的东西,Jeffrey Ricther 的 CLR via C# 非常棒。 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
【讨论】: