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

Nol*_*rin 14 .net reflection clr reflection.emit dynamic-method

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

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

svi*_*ick 15

我认为文档DynamicMethod解释得很好:

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

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

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