如何使用c#卸载.dll?

我正在使用.dll引用我的应用程序。 我想在按钮单击事件中卸载.dll。 怎么做 ???

您无法卸载单个程序集 – 您必须卸载整个AppDomain 。 换句话说,您需要在新的AppDomain加载其他程序集(和相关代码),然后当您要卸载它时卸载AppDomain

当然,这会让生活变得更加艰难,因为你不得不担心在AppDomains之间调用调用 – 但这只是.NET所允许的。

正如Jon Skeet所写,您无法卸载DLL,但您可以在另一个AppDomain中加载DLL – 然后卸载AppDomain。 这是唯一的方法。

然而,有些事情你需要变化,因为你自然必须在AppDomain上调用函数。 这可以通过两种不同的方式发生。

如果您来自一个AppDomain(让我们称之为A),获取对在AppDomain B中实例化的对象的引用,则默认行为是该对象跨AppDomain边界序列化。 这意味着A访问的对象实例与B访问的实例不同,并且在A中进行的修改不会反映在B中,除非您提供向对象发送的function。 这要求对象标记为Serializable。

但是,您可以通过让类inheritanceMarshalByRefObject来避免序列化。 如果对象是在AppDomain B中构造的,并且从AppDomain A调用,则调用将跨越AppDomain边界。 它仍然是相同的物理线程,因此您不会像在跨进程调用或COM跨公寓调用中那样拥有线程切换的开销。

但是如果在B中构造一个由A中的对象引用的对象,但是B中的对象不会被访问5分钟,则该对象将被释放。 可以在MarshalByRefObject.InitializeLifetimeService()中重写此行为。

另请参阅实现不带AppDomain的.NET插件的答案。 请注意评论中的讨论,他们指出它非常缓慢地泄漏内存。