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



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

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

然后我使用该moduleBuilder发出类型。

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

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

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

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

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

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

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

最新更新