.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 热插拔,无需重新启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章