为什么需要发出IL代码?

ojh*_*ins 6 c# il intermediate-language

我在一个相当大的代码库中工作,今天我找到了IL code一个正常的内部发光项目class.

包含要发出的IL代码的项目是Service Locator MSDN描述的实现.

什么是这样做的优点和为什么会变成这样做是并列使用的C#语言?

ang*_*son 14

通常,这是为了使用仅在运行时可用的信息来规避使用反射的开销.

然后,您将使用反射,根据您的操作,反射可能会很慢,以构建一个新代码,直接使用给定的数据,而不使用反射.

好处:

  • 性能

缺点:

  • 很难调试
  • 很难做对
  • 之后很难阅读代码
  • 陡峭的学习曲线

因此,在开始这项工作之前,您需要确保它真的物有所值.

请注意,这是一般答案.在您遇到的特定情况下,没有办法回答为什么这样做,也没有办法在没有实际看到代码的情况下获得哪些特定优点(或缺点).

  • 通过使用表达式树,您通常可以在没有许多其他问题的情况下获得性能.例如,[`ObjectModelAdaptor.BuildAccessor`](https://github.com/antlr/antlrcs/blob/master/Antlr4.StringTemplate/Misc/ObjectModelAdaptor.cs)方法都在运行时生成代码,但都没有明确生成构建IL操作码序列.由于参考类型和值类型之间的处理不同,此策略还完全消除了我们在初始测试期间遇到的错误. (3认同)

小智 5

这有很多用途。
最常用的场景之一是动态更改/注入代码:
.NET CLR 注入:在运行时修改 IL 代码


一个很好的教程可以帮助我理解它的良好用途: Dynamic...But Fast: The Tale of Three Monkeys, A Wolf and the DynamicMethod and ILGenerator Classes


祝你好运