如何从主AppDomain卸载程序集?
我想知道如何卸载加载到主AppDomain的程序集。
我有以下代码:
var assembly = Assembly.LoadFrom( FilePathHere );
当我完成时,我需要/希望能够卸载这个程序集。
谢谢你的帮助。
您无法从appdomain卸载程序集。 你可以销毁应用程序域,但是一旦程序集被加载到一个应用程序域中,它就在appdomain的生命周期中。
见Jason Zander的解释为什么没有Assembly.Unload方法?
如果您使用的是3.5,则可以使用AddIn Framework来更轻松地pipe理/调用不同的AppDomain(您可以卸载,卸载所有程序集)。 如果您之前使用的是版本,您需要自己创build一个新的AppDomain来卸载它。
你不能卸载程序集而不卸载整个AppDomain。 原因如下:
您正在应用程序域中运行该代码。 这意味着有潜在的呼叫地点和呼叫堆栈地址在他们期望继续工作。
假设您已经设法跟踪程序集和引用已经运行的代码。 假设你没有代码,一旦你成功地释放了程序集,你只能释放元数据和IL。 JIT代码仍然分配在应用程序域加载器堆中(JIT的方法按顺序在缓冲区中按调用顺序分配)。
最后一个问题涉及到代码已被加载共享,否则更正式地被称为“域中立”(检查/共享的ngen工具)。 在这种模式下,程序集的代码被生成从任何应用程序域执行(没有硬连线)。
build议您自然地在应用程序域边界周围devise应用程序,其中完全支持卸载。
我也知道这是非常古老的,但可能会帮助有这个问题的人! 这是我find的一个方法! 而不是使用:
var assembly = Assembly.LoadFrom( FilePathHere );
用这个:
var assembly = Assembly.Load( File.ReadAllBytes(FilePathHere));
这实际上加载了程序集文件的“内容”,而不是文件本身。 这意味着在组件文件上没有放置文件锁! 所以现在可以在不closures应用程序的情况下复制,删除或升级,或尝试使用单独的AppDomain或Marshaling!
优点:很简单,用1代码修复! 缺点:不能使用AppDomain,Assembly.Location或Assembly.CodeBase。
现在你只需要销毁在程序集上创build的所有实例。 例如:
assembly = null;
您应该将您的临时程序集加载到另一个AppDomain
,当不使用时,您可以卸载该AppDomain
。 这是安全和快速的。
如果您想要临时代码,可以随后卸载,根据您的需要, DynamicMethod
类可以做你想要的。 尽pipe如此,这不会给你上课。
下面是一个好例子,如何在运行时编译和运行dll,然后卸载所有资源: http : //www.west-wind.com/presentations/dynamicCode/DynamicCode.htm
我知道它的老,但可能会帮助某人。 您可以从stream中加载文件并将其释放。 它为我工作。 我在这里find了解决办法。
希望能帮助到你。
- 如何在任务栏上以全屏方式显示Windows窗体?
- 如何从UpdatePanel中的button强制完整回传?
- MailMessage,Sender和From属性之间的区别
- 从Visual Studio 2015发布 – 允许不受信任的证书
- 错误:未find具有不变名称“System.Data.SqlClient”的ADO.NET提供程序的entity framework提供程序
- 与服务器build立了连接,但在login前握手过程中发生错误
- 为什么Math.Ceiling返回double?
- SynchronizationContext做什么?
- .NET:当所需的configuration设置丢失时抛出哪个exception?