15

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

MSDN 似乎有关于这个主题的宝贵的少量高级信息。因此,如果有人可以解释什么是动态方法,所有XYZBuilder类在哪里发挥作用,以及它们各自的用途,那就太好了。我应该知道的任何其他 Reflection.Emit 类型和功能也将不胜感激。

4

1 回答 1

16

我认为文档DynamicMethod很好地解释了这一点:

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

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

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

于 2012-03-18T11:01:17.450 回答