如何使用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插件的答案。 请注意评论中的讨论,他们指出它非常缓慢地泄漏内存。
上述就是C#学习教程:如何使用c#卸载.dll?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987394.html