.NET dll 热插拔,无需重新启动应用程序

Posted

技术标签:

【中文标题】.NET dll 热插拔,无需重新启动应用程序【英文标题】:.NET dll hot swap, no application restart 【发布时间】:2014-09-30 15:17:52 【问题描述】:

假设您在 .NET (C#) 中有以下情况:

namespace MyDll

    public class MyClass
    
        public string GetValue()
        
            return "wrong value";
        
    

这段代码被编译成一个dll,比如MyDll.Dll。

然后你有一个名为 MyApplication.exe 的应用程序,它使用 MyDll.dll 作为引用,创建 MyClass 类的实例并调用 GetValue 方法:

MyClass instance = new MyClass();
instance.GetValue();

一旦你意识到 MyClass.GetValue() 的当前实现是错误的,有没有办法像这样修复 MyClass.GetValue() 方法

namespace MyDll

    public class MyClass
    
        public string GetValue()
        
            return "correct value";
        
    

并热交换生成的 MyDll.dll,而不重新启动 MyApplication.exe???

*** 和 google 中提出的所有解决方案都无法正常工作,因为即使在为此目的创建的新 AppDomain 上加载了 MyDll.dll,当我卸载调用时

AppDomain.Unload(anoterAppDomainJustForMyDll);

它返回时没有错误,但如果我尝试用更正后的 MyDll.dll 覆盖原始的 MyDll.dll(而 MyApplication.exe 仍在运行),我会收到错误“无法覆盖,因为另一个进程正在使用 dll”。 ...

【问题讨论】:

你需要把问题分解成一个具体的问题,没有一个人会经历这堆代码。 谢谢马库斯,我已经用谷歌搜索和 *** 来了解如何在 .net 中进行 dll 热交换,并且我经常找到基于创建附加 AppDomain 来加载和卸载 dll 的解决方案。但是一旦我卸载它,我就无法用新的 dll 覆盖磁盘上的 dll,因为它总是“正在使用”。这就是为什么我要求提出一个解决方案的建议,该解决方案可以成功完成所有步骤,直到结束。这个问题很复杂但很具体:什么代码可以解决这个问题。无论如何,谢谢你的好意建议。 这正是您应该问的问题,并尝试将发布的代码最小化为问题所需的部分。这样,您将获得更好的答案。 好的,马库斯,再次感谢,我会按照您的建议尝试重新提出问题。 【参考方案1】:

问题自行解决:请参考codeplex中的文章

对我来说,能够在不重新启动应用程序的情况下热交换新的 dll 非常重要,正如文章所建议的那样,这可以通过应用程序本身来完成。我之前的尝试失败的原因是我试图从外部覆盖目标dll(在这种情况下是在资源管理器中)。但是,如果按照建议的解决方案进行覆盖,从应用程序本身来说,它会按预期工作。

我需要在应用程序方面做更多的工作来定义可部署版本的 ddls 的目录,但这对我来说是完全可以接受的。

【讨论】:

以上是关于.NET dll 热插拔,无需重新启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

SylixOS热插拔概述

C# AppDomain 无法加载 DLL

游戏手柄热插拔不起作用

怎么才能够让Camera支持热插拔

RabbitMQ应用Demo:支持多个消费者实例热插拔

RabbitMQ应用Demo:支持多个消费者实例热插拔