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

Dej*_*jan 4 .net c# memory-leaks reflection.emit

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

var dynamicAssemblyName = new AssemblyName(assemblyName);
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = dynamicAssembly.DefineDynamicModule(assemblyName);
Run Code Online (Sandbox Code Playgroud)

然后,我用它moduleBuilder来发出类型。

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

可以卸载动态程序集并回收其内存,但要遵循动态类型生成的可收集程序集中描述的限制。

我只是没有找到如何卸载动态程序集,不幸的是,到“动态类型生成的可收集程序集”主题的链接已断开。

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

svi*_*ick 5

该页面的不再维护的版本似乎表明,一旦发出的类型超出范围,则自动进行卸载。我可以相信吗?

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

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