问题 表达式 .Compile和Garbage Collection


当我将表达式编译成可执行代码并获得委托时 - 当不再存在对该委托的引用时,代码是否会被垃圾收集?

有没有关于此的文件?因为我在MSDN中找不到任何有用的东西。


10401
2018-03-17 14:11


起源



答案:


是的,代码可以被垃圾收集。当你在一个表达式T上调用Compile时,代码被编译成一个 DynamicMethod的,那些有资格进行垃圾收集。

实际上它没有在MSDN上显示,但你可以看一下DLR中Expression <T> .Compile的实现,这是.net 4.0发布的:

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

虽然编译器的实现在.net 3.5中有所不同,但仍然使用DynamicMethods(来源:我自己,我在Mono中实现了System.Linq.Expressions)。

编译表达式树不可收集的情况是在您使用时 表达<T> CompileToMethod,并从AssemblyBuilder传递一个MethodBuilder,它不是用 RunAndCollect 旗。


11
2018-03-17 14:30



是否足够使用DynamicMethod?根据Eric提供的链接, msdn.microsoft.com/en-us/library/dd554932.aspx,需要使用特殊标志创建程序集。在反射器中,我可以看到方法DynamicMethod.GetDynamicMethodsModule()不会使用RunAndCollect创建一个程序集,而只能使用Run。 - Alex Shtof
是的,DynamicMethod足够了,这在MSDN中有说明。 DynamicMethods在CLR中具有特殊处理功能,并且确实具有收藏价值。 - Jb Evain
是的,我现在可以在DynamicMethod类的文档中看到它。谢谢 :) - Alex Shtof
我的理解也是。这很奇怪,我想知道“可收集装配”的重点是什么。 - Hans Passant
DynamicMethod来自.net 2.0,其中RunAndCollect不存在。它们在运行时具有特殊处理,而匿名的绑定到新模块。 RunAndCollect程序集是.net 4.0中的新程序集,并且范围显然比简单方法更广泛。 - Jb Evain


答案:


是的,代码可以被垃圾收集。当你在一个表达式T上调用Compile时,代码被编译成一个 DynamicMethod的,那些有资格进行垃圾收集。

实际上它没有在MSDN上显示,但你可以看一下DLR中Expression <T> .Compile的实现,这是.net 4.0发布的:

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

虽然编译器的实现在.net 3.5中有所不同,但仍然使用DynamicMethods(来源:我自己,我在Mono中实现了System.Linq.Expressions)。

编译表达式树不可收集的情况是在您使用时 表达<T> CompileToMethod,并从AssemblyBuilder传递一个MethodBuilder,它不是用 RunAndCollect 旗。


11
2018-03-17 14:30



是否足够使用DynamicMethod?根据Eric提供的链接, msdn.microsoft.com/en-us/library/dd554932.aspx,需要使用特殊标志创建程序集。在反射器中,我可以看到方法DynamicMethod.GetDynamicMethodsModule()不会使用RunAndCollect创建一个程序集,而只能使用Run。 - Alex Shtof
是的,DynamicMethod足够了,这在MSDN中有说明。 DynamicMethods在CLR中具有特殊处理功能,并且确实具有收藏价值。 - Jb Evain
是的,我现在可以在DynamicMethod类的文档中看到它。谢谢 :) - Alex Shtof
我的理解也是。这很奇怪,我想知道“可收集装配”的重点是什么。 - Hans Passant
DynamicMethod来自.net 2.0,其中RunAndCollect不存在。它们在运行时具有特殊处理,而匿名的绑定到新模块。 RunAndCollect程序集是.net 4.0中的新程序集,并且范围显然比简单方法更广泛。 - Jb Evain