如何使用c#卸载.dll?

时间:2009-09-03 07:21:51

标签: c#

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:0)

另见Implementing .NET plug-ins without AppDomains的答案。请注意评论中的讨论,他们指出它会非常缓慢地泄漏内存。

相关问题