c# - .NET dll 热插拔,无需重启应用程序

标签 c# dynamic dll reload

假设您在 .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";
        }
    }
}

并在不重新启动 MyApplication.exe 的情况下热交换生成的 MyDll.dll???

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

AppDomain.Unload(anoterAppDomainJustForMyDll);

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

最佳答案

问题已自行关闭:请引用codeplex中的文章

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

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

关于c# - .NET dll 热插拔,无需重启应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181542/

相关文章:

c# - 如何集中监控发送到应用程序或 winform 的消息

c# - wpf:usercontrol 与 customcontrol 性能问题

c++ - 如何动态包含makefile

Javascript 二维数组

c# - DLL 和内存不足异常

c# - 0xC0000005 : Access violation reading location 0xffffffffffffffff

c - 如何将变量设置为与另一个指针分配和指向的空间量相同?

C# dll 求解简单方程

c++ - 关于如何修复 Visual Studio 2019 中的 Dll 初始化错误的任何想法?

c# - Dynamodb putitem 功能无法正常工作