我已经在基于反射的C#代码中遇到了一些动态方法,但是我还没有确切地弄清楚它们是什么。特别是似乎有一个DynamicMethod
类,它允许在运行时生成和指定CLR方法。但是还有MethodBuilder
类。他们似乎都做着非常相似的事情。显然,“动态程序集”是AssemblyBuilder
类,而“动态类型”是TypeBuilder
类。无论如何,它们都驻留在System.Reflection.Emit
命名空间中。
MSDN似乎对此主题没有什么宝贵的高级信息。因此,如果有人可以解释什么是动态方法,那么所有XYZBuilder
类都在这里起作用,以及它们分别用于什么用途,那就太好了。我应该了解的任何其他Reflection.Emit类型和功能也将不胜感激。
最佳答案
我认为the documentation for DynamicMethod
很好地解释了这一点:
您可以使用DynamicMethod
类在运行时生成和执行方法,而不必生成动态程序集和包含该方法的动态类型。回收DynamicMethod
对象时,将回收即时(JIT)编译器创建的可执行代码。动态方法是生成和执行少量代码的最有效方法。
如果需要动态创建一个或多个方法,请使用DynamicMethod
。如果要创建整个类型,则意味着需要创建一个动态程序集(AssemblyBuilder
),然后在其中创建一个模块(ModuleBuilder
),然后创建一个或多个类型(TypeBuilder
)。要在这些类型中创建方法,可以使用MethodBuilder
。
另一个区别是GC:DynamicMethod
总是可以被垃圾收集,并且被一个一个地收集。也就是说,任何方法只要停止使用就可以收集。另一方面,只有在指定动态装配时(使用AssemblyBuilderAccess.RunAndCollect
),才能收集动态装配,并且始终按装配来收集它们。例如,如果装配体中有两种类型,而仅使用其中一种,则无法收集另一种。
关于.net - 什么是动态方法?DynamicMethod与MethodBuilder有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9755991/