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

本文关键字:重新启动 应用程序 dll 热插拔 net | 更新日期: 2023-09-27 18:16:51

假设你在。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?

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

AppDomain.Unload(anoterAppDomainJustForMyDll);

它返回没有错误,但如果我试图覆盖原来的MyDll.dll与更正的一个(而MyApplication.exe仍在运行),我得到一个错误"不可能覆盖,因为dll在使用另一个进程"....

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

问题由我自己关闭:请参阅codeplex中的文章

对我来说,能够在不重新启动应用程序的情况下热插拔新的dll是很重要的,正如本文所建议的,这是可以做到的,因为这是在应用程序本身中完成的。我以前的尝试失败的原因是我试图从外部覆盖目标dll(在这种情况下是在资源管理器中)。但是,如果像建议的解决方案中那样,从应用程序本身完成覆盖,则可以按预期工作。

在应用程序端,我需要更多的东西来定义可以部署版本化ddl的目录,但这对我来说是完全可以接受的。