MEF e ShadowCopying DLLs para que eu possa sobrescrevê-los em tempo de execução
Eu estou tentando parar meu aplicativo bloqueio DLLs no meu diretório de plug-in MEF para que eu possa substituir os assemblies em tempo de execução (nota que eu não estou realmente tentando ter MEF recarregá-los on the fly, no próximo início do aplicativo é bom, eu apenas não quer ter que parar o aplicativo para fazer a cópia)
Eu estou tentando fazer isso criando um domínio de aplicativo copiado sombra para meus assemblies carregados mef como abaixo:
[Serializable]
public class Composer:IComposer
{
private readonly string _pluginPath;
public Composer(IConfigurePluginDirectory pluginDirectoryConfig)
{
_pluginPath = pluginDirectoryConfig.Path;
var setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true"; // really??? is bool not good enough for you?
var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + "_PluginDomain", AppDomain.CurrentDomain.Evidence, setup);
appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain));
}
private void DoWorkInShadowCopiedDomain()
{
// This work will happen in the shadow copied AppDomain.
var catalog = new AggregateCatalog();
var dc = new DirectoryCatalog(_pluginPath);
catalog.Catalogs.Add(dc);
Container = new CompositionContainer(catalog);
}
public CompositionContainer Container { get; private set; }
}
e, em seguida, acesse meu catálogo de componentes do MEF por meio do CompositionContainer nessa classe. No entanto, o contêiner de composição parece ser inicializado apenas dentro do domínio shadowcopy (o que faz sentido) e isso significa que é nulo em meu domínio de aplicativo. Eu só queria saber se há uma maneira melhor de fazer isso ou alguma maneira de cruzar a consulta de domínio para obter meus componentes MEF