我在基于反射的C#代码中遇到了一些动态方法,我还没弄清楚它们究竟是什么。特别是似乎有一个DynamicMethod
类允许在运行时生成和指定CLR方法。但是那时还有MethodBuilder
类。他们似乎都做了非常相似的事情。显然,“动态程序集”是AssemblyBuilder
类,“动态类型”是TypeBuilder
类。无论如何,它们都驻留在System.Reflection.Emit
名称空间中。
XYZBuilder
类都会发挥作用,以及它们各自用于什么,那就太棒了。我应该知道的任何其他Reflection.Emit类型和功能也将受到赞赏。
答案 0 :(得分:14)
我认为the documentation for DynamicMethod
很好地解释了这一点:
您可以使用
DynamicMethod
类在运行时生成并执行方法,而无需生成动态程序集和动态类型来包含该方法。当回收DynamicMethod
对象时,回收由实时(JIT)编译器创建的可执行代码。动态方法是生成和执行少量代码的最有效方法。
如果您需要动态创建一个或多个方法,请使用DynamicMethod
。如果要创建整个类型,则意味着您需要创建动态程序集(AssemblyBuilder
),然后在其中创建一个模块(ModuleBuilder
),然后创建一个或多个类型(TypeBuilder
})。要在这些类型中创建方法,您可以使用MethodBuilder
。
另一个区别是GC:DynamicMethod
可以随时被垃圾收集,并逐个收集。也就是说,一旦停止使用它,就可以收集任何方法。另一方面,动态程序集只有在您指定它时才能收集(通过使用AssemblyBuilderAccess.RunAndCollect
),并且它们总是按程序集合收集。例如,如果程序集中有两种类型,并且只使用其中一种类型,则无法收集另一种类型。