【发布时间】: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???
stackoverflow 和 google 中提出的所有解决方案都无法正常工作,因为即使在为此目的创建的新 AppDomain 上加载了 MyDll.dll,当我卸载调用时
AppDomain.Unload(anoterAppDomainJustForMyDll);
它返回时没有错误,但如果我尝试用更正后的 MyDll.dll 覆盖原始的 MyDll.dll(而 MyApplication.exe 仍在运行),我会收到错误“无法覆盖,因为另一个进程正在使用 dll”。 ...
【问题讨论】:
-
你需要把问题分解成一个具体的问题,没有一个人会经历这堆代码。
-
谢谢马库斯,我已经用谷歌搜索和 stackoverflow 来了解如何在 .net 中进行 dll 热交换,并且我经常找到基于创建附加 AppDomain 来加载和卸载 dll 的解决方案。但是一旦我卸载它,我就无法用新的 dll 覆盖磁盘上的 dll,因为它总是“正在使用”。这就是为什么我要求提出一个解决方案的建议,该解决方案可以成功完成所有步骤,直到结束。这个问题很复杂但很具体:什么代码可以解决这个问题。无论如何,谢谢你的好意建议。
-
这正是您应该问的问题,并尝试将发布的代码最小化为问题所需的部分。这样,您将获得更好的答案。
-
好的,马库斯,再次感谢,我会按照您的建议尝试重新提出问题。