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.