如何从主AppDomain卸载程序集?

我想知道如何卸载加载到主AppDomain的程序集。

我有以下代码:

var assembly = Assembly.LoadFrom( FilePathHere ); 

当我完成时,我需要/希望能够卸载这个程序集。

谢谢你的帮助。

您无法从appdomain卸载程序集。 你可以销毁应用程序域,但是一旦程序集被加载到一个应用程序域中,它就在appdomain的生命周期中。

见Jason Zander的解释为什么没有Assembly.Unload方法?

如果您使用的是3.5,则可以使用AddIn Framework来更轻松地pipe理/调用不同的AppDomain(您可以卸载,卸载所有程序集)。 如果您之前使用的是版本,您需要自己创build一个新的AppDomain来卸载它。

你不能卸载程序集而不卸载整个AppDomain。 原因如下:

  1. 您正在应用程序域中运行该代码。 这意味着有潜在的呼叫地点和呼叫堆栈地址在他们期望继续工作。

  2. 假设您已经设法跟踪程序集和引用已经运行的代码。 假设你没有代码,一旦你成功地释放了程序集,你只能释放元数据和IL。 JIT代码仍然分配在应用程序域加载器堆中(JIT的方法按顺序在缓冲区中按调用顺序分配)。

  3. 最后一个问题涉及到代码已被加载共享,否则更正式地被称为“域中立”(检查/共享的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了解决办法。

希望能帮助到你。