【问题标题】:Advantages of CIL knowledge in .NET [closed].NET 中 CIL 知识的优势 [关闭]
【发布时间】:2009-02-11 17:57:07
【问题描述】:

了解 CIL 有什么好处?

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

如何了解更多信息?有没有像 Jon Skeet 的 C# 书这样的书?

【问题讨论】:

标签: c# .net cil


【解决方案1】:

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

只要通读它们就会给你很多信息。

(我也听说CLR via C#很好,但我自己没看过。)

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      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。

      【讨论】:

        【解决方案4】:

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

        几个可能的优势:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2015-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-27
            • 1970-01-01
            • 1970-01-01
            • 2013-05-15
            • 2016-12-10
            相关资源
            最近更新 更多