为了优化性能,我使用以下代码为每个用户请求动态创建新类型:
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()
以触发垃圾回收,然后再次检查加载的程序集。