如何卸载使用RunAndCollect创建的动态程序集?

时间:2017-06-19 14:11:56

标签: c# .net memory-leaks reflection.emit

对于性能优化,我使用以下代码为每个用户请求动态创建新类型:

var dynamicAssemblyName = new AssemblyName(assemblyName);
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = dynamicAssembly.DefineDynamicModule(assemblyName);

然后我使用moduleBuilder发出类型。

这会为每个请求创建一个新的动态程序集。因此,在应用程序的生命周期中,我最终可能会遇到很多这样的问题。所以,我担心资源会被释放。因此,我正在使用AssemblyBuilderAccess.RunAndCollect来实现这一目标。 msdn说:

  

可以卸载动态装配并回收其内存,但需遵守动态类型生成的可收集装配中所述的限制。

我只是没有找到如何卸载动态程序集,遗憾的是,动态类型生成的可收集程序集主题链接已被破坏。

不再维护的version of that page似乎表明一旦发出的类型超出范围,卸载就会自动发生。我能相信吗?

1 个答案:

答案 0 :(得分:3)

  

该页面的不再维护版本似乎表明一旦发出的类型超出范围,卸载就会自动发生。我能相信吗?

是。该选项称为RunAndCollect,因为当垃圾收集器决定不再需要它们时,会自动卸载这些程序集。没有API可以强制卸载可收集的程序集(除了触发GC)。

您可以通过使用AppDomain.CurrentDomain.GetAssemblies()检查当前加载的程序集,然后调用GC.Collect()来触发垃圾回收,然后再次检查已加载的程序集来验证这一点。