如何卸载使用 RunAndCollect 创建的动态程序集?
How to unload a dynamic assembly created with RunAndCollect?
为了优化性能,我使用以下代码根据用户请求动态创建新类型:
var dynamicAssemblyName = new AssemblyName(assemblyName);
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = dynamicAssembly.DefineDynamicModule(assemblyName);
然后我使用 moduleBuilder
来发出类型。
这会根据请求创建一个新的动态程序集。所以我可以在应用程序的生命周期内完成其中的许多工作。所以,我担心资源会被释放。因此,我使用 AssemblyBuilderAccess.RunAndCollect 来实现这一点。 msdn 说:
The dynamic assembly can be unloaded and its memory reclaimed, subject to the restrictions described in Collectible Assemblies for Dynamic Type Generation.
我只是没有找到如何卸载 动态程序集,不幸的是 link 动态类型生成的可收集程序集主题被破坏了。
不再维护的 version of that page 似乎表明一旦发出的类型超出范围,卸载就会自动发生。我可以相信这个吗?
A no-longer-maintained version of that page seems to indicated that the unloading happens automatically once the emitted type gets out of scope. Can I trust this?
是的。该选项称为 RunAndCollect
,因为当垃圾收集器决定不再需要这些程序集时,它们会自动卸载。没有 API 强制卸载可收集程序集(除了触发 GC)。
您可以通过使用 AppDomain.CurrentDomain.GetAssemblies()
检查当前加载的程序集来验证这一点,然后调用 GC.Collect()
触发垃圾收集,然后再次检查加载的程序集。
为了优化性能,我使用以下代码根据用户请求动态创建新类型:
var dynamicAssemblyName = new AssemblyName(assemblyName);
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = dynamicAssembly.DefineDynamicModule(assemblyName);
然后我使用 moduleBuilder
来发出类型。
这会根据请求创建一个新的动态程序集。所以我可以在应用程序的生命周期内完成其中的许多工作。所以,我担心资源会被释放。因此,我使用 AssemblyBuilderAccess.RunAndCollect 来实现这一点。 msdn 说:
The dynamic assembly can be unloaded and its memory reclaimed, subject to the restrictions described in Collectible Assemblies for Dynamic Type Generation.
我只是没有找到如何卸载 动态程序集,不幸的是 link 动态类型生成的可收集程序集主题被破坏了。
不再维护的 version of that page 似乎表明一旦发出的类型超出范围,卸载就会自动发生。我可以相信这个吗?
A no-longer-maintained version of that page seems to indicated that the unloading happens automatically once the emitted type gets out of scope. Can I trust this?
是的。该选项称为 RunAndCollect
,因为当垃圾收集器决定不再需要这些程序集时,它们会自动卸载。没有 API 强制卸载可收集程序集(除了触发 GC)。
您可以通过使用 AppDomain.CurrentDomain.GetAssemblies()
检查当前加载的程序集来验证这一点,然后调用 GC.Collect()
触发垃圾收集,然后再次检查加载的程序集。