显式收集DynamicMethod

本文关键字:DynamicMethod | 更新日期: 2023-09-27 18:09:13

From MSDN:

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

我有以下代码:

Type returnType = typeof(string);
Type[] argTypes = { typeof(string), typeof(IEnumerable<string>) };
var dynamicMethod = new DynamicMethod("DynamicMethod1", returnType, argTypes);
ILGenerator ilGen = dynamicMethod.GetILGenerator();
const string Returned = "returned";
ilGen.Emit(OpCodes.Ldstr, Returned);
ilGen.Emit(OpCodes.Ret);
var handler =
    (Func<string, IEnumerable<string>, string>)
    dynamicMethod.CreateDelegate(typeof(Func<string, IEnumerable<string>, string>));

。我用一些简单的主体创建动态方法,然后我想把委托保存为静态属性。在多次调用此委托后,我想回收/收集方法并使用另一个主体重新创建它(我编写了解释语言,将我的自定义语法解释为MSIL字节码-类似编译器),并将新委托保存为静态属性。

如何显式收集/回收动态方法?

显式收集DynamicMethod

不能显式地处置DynamicMethod,因为它没有实现IDisposable接口。但是,您可以告诉GarbageCollector何时需要收集:System.GC.Collect();

根据MSDN

这个"强制所有代的立即垃圾收集"