Ajuda necessária para descarregar .DLLs do AppDomain - Ainda não funciona, mesmo com o ShadowCopy

Estou tentando fazer o seguinte. O aplicativo A é o "aplicativo mãe". Permanece aberto. O aplicativo B é apenas um .DLL onde escrevo algumas classes derivadas de uma interface especificada no aplicativo A.

Em seguida, no aplicativo A, "importarei" as classes do aplicativo B e executarei os métodos dentro delas. Quero poder alterar dinamicamente o aplicativo B (alterar código e recompilar) e usar o novo código no aplicativo A.

Eu tenho um comando pós-compilação no aplicativo B que copia o novo .DLL para o diretório do aplicativo A. O aplicativo A cria um novo AppDomain e usa ShadowCopying. Eu pensei que isso seria suficiente, mas quando tento recompilar e copiar o novo .DLL do App B, ele diz que o arquivo está em uso e não pode ser substituído.

Aqui está o código que tenho até agora:

Aplicativo A (TestServer no código):

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 no código):

namespace TestClient
{    
    public class TestRunner : TestServer.IRunnable
    {
        public void Run()
        {
            Console.WriteLine("RUNNING");
        }
    }

    public class Bob : TestServer.IRunnable
    {
        public void Run()
        {
            Console.WriteLine("BOB");
        }
    }
}

Eu li que, se você usar itens de outros domínios de aplicativos, esses domínios poderão carregar automaticamente o .DLL ou algo assim. Nesse caso, receio que o uso da interface esteja causando o AppDomain base para carregar o .DLL, bloqueando-o.

Como posso resolver esse problema / existe uma configuração melhor?

NOTA: Atualizei meu código e ele ainda gera o mesmo resultado.

questionAnswers(3)

yourAnswerToTheQuestion