c#-从AppDomain卸载.DLL所需的帮助-即使使用ShadowCopy也无法正常工作

我正在尝试执行以下操作.应用程序A是“母应用程序”.它保持打开状态. App B只是一个.DLL,我在其中编写了一些从App A中指定的接口派生的类.

然后,从App A中,我将从App B中“导入”类并在其中运行方法.我希望能够动态更改App B(更改代码并重新编译)并在App A中使用新代码.

我在App B中有一个后编译命令,它将新的.DLL复制到App A目录中. App 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++;
            }
        }   
    }   
}

应用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从而将其锁定.

我该如何解决此问题/是否有更好的设置?

注意:我已经更新了我的代码,它仍然产生相同的结果.

解决方法:

当您将程序集和类型拖入其中时,您的代码仍在母AppDomain中运行.任何代码都应在产生的域中运行.我已经在我的网站上展示了一种设置类似内容的方法:A simple way to start your code in a different AppDomain

我对此不是100%的确定,但这当然是您必须采取的步骤

更新资料

根据此处提供的解决方案,运行器的实例化将发生在DomainLifetimeHook的继承者中.所示的基础结构确保Start和Stop方法在由AppDomainExpander类创建的AppDomain中运行.该Expander是创建新域的类,因此您的域设置应放在域的Create方法中.

上一篇:NPIO导入导出excel文件


下一篇:C#-将DLL加载到具有唯一已知公共接口的单独AppDomain中