2012-03-18 103 views
8

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

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

回答

9

我觉得the documentation for DynamicMethod解释这口井:

可以使用DynamicMethod类来生成并执行在运行时的方法,而不必生成一个动态组件和动态类型包含的方法。由于即时(JIT)编译器创建的可执行代码在回收对象时收回。动态方法是生成和执行少量代码的最有效方法。

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

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

+0

Doh。这么晚读MSDN页面时,我一定错过了这一点。谢谢。 – Noldorin 2012-03-18 12:48:56

相关问题