LambdaExpression.Compile() 是否创建一个动态加载的额外程序集?
Does LambdaExpression.Compile() create an extra assembly which is dynamically loaded?
我想要几个使用表达式树动态创建的例程。似乎使用它们的最简单方法是创建 LambdaExpression
然后调用 LambdaExpression
.
Compile()
生成一个可调用委托。
这种解决方案可能带来的性能损失是什么?
编译过程中到底发生了什么?
是否创建并动态加载了具有额外新 class 类型的额外程序集?
我每次调用 Compile()
时都会发生这种情况吗?
通过使用TypeBuilder
和MethodBuilder
创建一个新类型并将所有例程包含为该类型的静态方法是否更好?
欢迎提出任何建议!
- 发射阶段、反射启动的委托创建——实际上只是构建表达式树——相对昂贵;如果你 每次都这样做 会很痛;但是,如果您有效地缓存策略(这样您就不会构建表达式树并不断编译它),那就完全没问题了,并且一种进行元编程的合理方法
- 通常,在
DynamicMethod
上调用 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
- 没有;
DynamicMethod
试图避免这种情况
- 是的;所以尝试缓存你的策略
- 取决于上下文;有些事情
DynamicMethod
可以做到而 TypeBuilder
不能(例如,可访问性跳过),有些事情 TypeBuilder
可以做到而 DynamicMethod
不能(实现接口、声明和使用字段等);如果你不需要这些东西,Expression.Compile()
是避免学习低级 ref-emit 的一个很好的方法,很容易出错(并且无效的 IL 通常会终止运行时)
- (你没有问 6,但是......)还应该注意
Expression
可以选择 欺骗 发射,实际上 运行 通过 AST 解释器代替,在不允许 ref-emit 的运行时; Compile()
returns 此解释器的入口点, 而不是 动态编译方法的委托;如果您使用 TypeBuilder
,则此选项不可用
我想要几个使用表达式树动态创建的例程。似乎使用它们的最简单方法是创建 LambdaExpression
然后调用 LambdaExpression
.
Compile()
生成一个可调用委托。
这种解决方案可能带来的性能损失是什么?
编译过程中到底发生了什么?
是否创建并动态加载了具有额外新 class 类型的额外程序集?
我每次调用
Compile()
时都会发生这种情况吗?通过使用
TypeBuilder
和MethodBuilder
创建一个新类型并将所有例程包含为该类型的静态方法是否更好?欢迎提出任何建议!
- 发射阶段、反射启动的委托创建——实际上只是构建表达式树——相对昂贵;如果你 每次都这样做 会很痛;但是,如果您有效地缓存策略(这样您就不会构建表达式树并不断编译它),那就完全没问题了,并且一种进行元编程的合理方法
- 通常,在
DynamicMethod
上调用 - 没有;
DynamicMethod
试图避免这种情况 - 是的;所以尝试缓存你的策略
- 取决于上下文;有些事情
DynamicMethod
可以做到而TypeBuilder
不能(例如,可访问性跳过),有些事情TypeBuilder
可以做到而DynamicMethod
不能(实现接口、声明和使用字段等);如果你不需要这些东西,Expression.Compile()
是避免学习低级 ref-emit 的一个很好的方法,很容易出错(并且无效的 IL 通常会终止运行时) - (你没有问 6,但是......)还应该注意
Expression
可以选择 欺骗 发射,实际上 运行 通过 AST 解释器代替,在不允许 ref-emit 的运行时;Compile()
returns 此解释器的入口点, 而不是 动态编译方法的委托;如果您使用TypeBuilder
,则此选项不可用
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