什么是动态方法,DynamicMethod与MethodBuilder有何不同?

时间:2012-03-18 04:27:05

标签: .net reflection clr reflection.emit dynamic-method

我在基于反射的C#代码中遇到了一些动态方法,我还没弄清楚它们究竟是什么。特别是似乎有一个DynamicMethod类允许在运行时生成和指定CLR方法。但是那时还有MethodBuilder类。他们似乎都做了非常相似的事情。显然,“动态程序集”是AssemblyBuilder类,“动态类型”是TypeBuilder类。无论如何,它们都驻留在System.Reflection.Emit名称空间中。

MSDN似乎很少有关于此主题的高级信息。因此,如果有人可以解释什么是动态方法,那么这里的所有XYZBuilder类都会发挥作用,以及它们各自用于什么,那就太棒了。我应该知道的任何其他Reflection.Emit类型和功能也将受到赞赏。

1 个答案:

答案 0 :(得分:14)

我认为the documentation for DynamicMethod很好地解释了这一点:

  

您可以使用DynamicMethod类在运行时生成并执行方法,而无需生成动态程序集和动态类型来包含该方法。当回收DynamicMethod对象时,回收由实时(JIT)编译器创建的可执行代码。动态方法是生成和执行少量代码的最有效方法。

如果您需要动态创建一个或多个方法,请使用DynamicMethod。如果要创建整个类型,则意味着您需要创建动态程序集(AssemblyBuilder),然后在其中创建一个模块(ModuleBuilder),然后创建一个或多个类型(TypeBuilder })。要在这些类型中创建方法,您可以使用MethodBuilder

另一个区别是GC:DynamicMethod可以随时被垃圾收集,并逐个收集。也就是说,一旦停止使用它,就可以收集任何方法。另一方面,动态程序集只有在您指定它时才能收集(通过使用AssemblyBuilderAccess.RunAndCollect),并且它们总是按程序集合收集。例如,如果程序集中有两种类型,并且只使用其中一种类型,则无法收集另一种类型。