LambdaExpression.Compile() 是否创建一个动态加载的额外程序集?

Does LambdaExpression.Compile() create an extra assembly which is dynamically loaded?

我想要几个使用表达式树动态创建的例程。似乎使用它们的最简单方法是创建 LambdaExpression 然后调用 LambdaExpression.
Compile() 生成一个可调用委托。

  1. 发射阶段、反射启动的委托创建——实际上只是构建表达式树——相对昂贵;如果你 每次都这样做 会很痛;但是,如果您有效地缓存策略(这样您就不会构建表达式树并不断编译它),那就完全没问题了,并且一种进行元编程的合理方法
  2. 通常,在 DynamicMethod
  3. 上调用 DynamicMethod is generated - which is a standalone method that avoids all the usual weight of AssemblyBuiler, ModuleBuilder, TypeBuilder etc, and just provides raw access to an ILGenerator to a static-style method; the code then walks the expression tree, emitting the appropriate op-codes via ILGenerator; finally, CreateDelegate
  4. 没有; DynamicMethod 试图避免这种情况
  5. 是的;所以尝试缓存你的策略
  6. 取决于上下文;有些事情 DynamicMethod 可以做到而 TypeBuilder 不能(例如,可访问性跳过),有些事情 TypeBuilder 可以做到而 DynamicMethod 不能(实现接口、声明和使用字段等);如果你不需要这些东西,Expression.Compile() 是避免学习低级 ref-emit 的一个很好的方法,很容易出错(并且无效的 IL 通常会终止运行时)
  7. (你没有问 6,但是......)还应该注意 Expression 可以选择 欺骗 发射,实际上 运行 通过 AST 解释器代替,在不允许 ref-emit 的运行时; Compile() returns 此解释器的入口点, 而不是 动态编译方法的委托;如果您使用 TypeBuilder
  8. ,则此选项不可用