Я пытаюсь остановить приложение блокировки DLL в моем каталоге плагинов MEF, чтобы я мог перезаписывать сборки во время выполнения (обратите внимание, что я на самом деле не пытаюсь перезагрузить MEF на лету, при следующем запуске приложения это нормально, я просто не хочу останавливать приложение, чтобы сделать копию)
Я пытаюсь сделать это, создав теневой скопированный домен приложения для моих загруженных mef-сборок, как показано ниже:
[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; }
}
а затем получить доступ к моему каталогу компонентов MEF через CompositionContainer этого класса. Однако контейнер состава кажется инициализированным только внутри области shadowcopy (что имеет смысл), а это значит, что его нуль в моем домене приложения. Я просто задавался вопросом, есть ли лучший способ сделать это или каким-то образом перекрещивать запрос домена, чтобы получить мои компоненты MEF.