【发布时间】:2011-02-17 21:06:11
【问题描述】:
我正在尝试执行以下操作。应用 A 是“母应用”。它保持打开状态。 App B 只是一个 .DLL,我在其中编写了一些从 App A 中指定的接口派生的类。
然后,从 App A 中,我将从 App B 中“导入”类并在其中运行方法。我希望能够动态更改 App B(更改代码并重新编译)并在 App A 中使用新代码。
我在 App B 中有一个后编译命令,它将新的 .DLL 复制到 App A 目录。应用 A 创建一个新的 AppDomain 并使用 ShadowCopying。我认为这已经足够了,但是当我尝试重新编译和复制 App B 的新 .DLL 时,它说该文件正在使用中并且无法被覆盖。
这是我现在拥有的代码:
App A(代码中的TestServer):
namespace TestServer
{
public interface IRunnable
{
void Run();
}
class Program
{
static void Main(string[] args)
{
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = "DemoApp";
setup.ApplicationBase = Environment.CurrentDirectory;
setup.ShadowCopyDirectories = Environment.CurrentDirectory;
setup.ShadowCopyFiles = "true";
int _domain = 1;
while (true)
{
string typeName = Console.ReadLine();
AppDomain appDomain = AppDomain.CreateDomain("DemoDomain" + _domain, null, setup);
IRunnable runner = appDomain.CreateInstanceFromAndUnwrap("TestClient.dll", typeName) as IRunnable;
runner.Run();
AppDomain.Unload(appDomain);
_domain++;
}
}
}
}
App B(代码中的TestClient):
namespace TestClient
{
public class TestRunner : TestServer.IRunnable
{
public void Run()
{
Console.WriteLine("RUNNING");
}
}
public class Bob : TestServer.IRunnable
{
public void Run()
{
Console.WriteLine("BOB");
}
}
}
我已经读到,如果您使用来自其他应用程序域的东西,这些应用程序域可以自动加载 .DLL 或类似的东西。在这种情况下,我担心使用接口会导致基础 AppDomain 加载 .DLL 从而将其锁定。
我该如何解决这个问题/有更好的设置吗??
注意:我已经更新了我的代码,它仍然产生相同的结果。
【问题讨论】:
-
好吧,我决定努力破解它,一劳永逸地解决这个问题。这个解决方案远非优雅,但它有效。基本上,每次我输入一个新名称时,我都会用不同的名称复制 dll,加载并使用它。最后,我尝试删除它们(如果它们没有被锁定)。暂时解决我的问题,直到我成为更好的程序员。
标签: c# appdomain shadow-copy appdomainsetup