如何使用c#卸载.dll?

如何使用c#卸载.dll?,c#,C#,我正在对我的应用程序使用.dll引用。 我想在按钮单击事件中卸载.dll。 如何操作???您不能卸载单个程序集-您必须卸载整个AppDomain。换句话说,您需要在新的AppDomain中加载其他程序集(和关联的代码),然后当您想要卸载它时,卸载AppDomain 当然,这会让生活变得更加艰难,因为你不得不担心在AppDomain之间封送调用—但这是.NET所允许的。正如Jon Skeet所写的,你不能卸载DLL,但你可以在另一个AppDomain中加载DLL—然后卸载AppDomain。这是唯

我正在对我的应用程序使用.dll引用。 我想在按钮单击事件中卸载.dll。
如何操作???

您不能卸载单个程序集-您必须卸载整个
AppDomain
。换句话说,您需要在新的
AppDomain
中加载其他程序集(和关联的代码),然后当您想要卸载它时,卸载
AppDomain


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

正如Jon Skeet所写的,你不能卸载DLL,但你可以在另一个AppDomain中加载DLL—然后卸载AppDomain。这是唯一的办法

但是,有些事情需要改变,因为您自然需要跨AppDomain调用函数。这可能以两种不同的方式发生

如果您从一个AppDomain(我们称之为A)获取对AppDomain B中实例化的对象的引用,那么默认行为是跨AppDomain边界序列化该对象。这意味着A访问的对象实例与B访问的实例不同,在A中所做的修改不会反映在B中,除非您提供了发送回对象的功能。这需要将对象标记为可序列化

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


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

另请参见的答案。注意评论中的讨论,他们指出它非常缓慢地泄漏内存

这是一个后台winapp,因为只有在任务管理器中关闭应用程序才能关闭它。即使像那样关闭了应用程序,也不会卸载.dll。这就是为什么我想强制卸载它。还有什么其他的方法?如果你的进程已经走了,那么它就不应该保持在DLL上。你确定这不是别的过程吗?使用SysInternals工具检查.martialling->marshalling?顺便说一句,我认为在应用程序域之间可以封送的类型/实例有限制。@Peter:谢谢你发现了咖啡之前的错误。是的,有限制和问题等,这就是为什么它如此困难:(