我对 DynamicMethods、表达式树和 DLR 之间的交互和关系有一些疑问。
我知道 LambdaExpression.Compile 在内部使用 ILGenerator 来创建委托。但是,编译的 LambdaExpression 和 DynamicMethod 之间存在一些根本区别。例如
一个。DynamicMethods 调用更快
湾。编译的 LambdaExpressions 可以嵌入闭包(非原始值的常量表达式)
湾。编译的 LambdaExpressions 没有 DeclaringType。
问题:
一个。为什么调用 DynamicMethods 比调用已编译的 LambdaExpressions 更快?
湾。允许闭包的编译 LambdaExpressions 有什么特别之处?当我使用非 ConstantExpression 时,表达式树是否真的生成了一个闭包类?如果是这样,这个生成的类会去哪里?
C。编译的 LambdaExpressions 去哪里(在运行时)?对他们的支持在哪里实施。它不能只是 Reflection.Emit,可以吗?
我知道 dynamic 关键字实际上只是用于发出 CSharp CallSites、Binders 等的编译器技巧。据我了解,在内部,它们会生成表达式树,并且还使用 C# 编译器的精简版本。
问题
一个。生成的表达式树是一般 CallSiteBinders 的函数还是它们在 Microsoft.CSharp dll 中的具体实现和使用?
湾。这些表达式树是由 DynamicExpression 节点组成的吗?或者是其他东西?如果是别的,为什么?
C。C# 编译器的精简版在哪里以及为什么会发挥作用?为什么以及它与对 LambdaExpression.Compile 或 DynamicMethods 或任何类型的 IL 生成的常规调用有何不同?我可以理解如何使用 CallSiteBinders 来构建表达式树,但为什么在转换发生后需要 C# 编译器?一旦它采用表达式树(这只是一个 API)的形式,C# 与它有什么关系。