Pliki DLL MEF i ShadowCopying, dzięki czemu mogę je zastąpić w czasie wykonywania
Próbuję zatrzymać moje zablokowane biblioteki aplikacji w katalogu wtyczek MEF, dzięki czemu mogę nadpisać zespoły w czasie wykonywania (zauważ, że faktycznie nie próbuję załadować MEF w locie, przy następnym uruchomieniu aplikacji jest dobrze, po prostu nie chcę zatrzymywać aplikacji, aby wykonać kopię)
Próbuję to zrobić, tworząc domenę aplikacji skopiowaną w tle dla moich załadowanych zestawów, jak poniżej:
[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; }
}
a następnie uzyskaj dostęp do mojego katalogu komponentów MEF za pomocą CompositionContainer w tej klasie. Wydaje się jednak, że kontener kompozycji jest inicjowany tylko w domenie shadowcopy (co ma sens), a to oznacza, że jego null w mojej domenie aplikacji. Zastanawiałem się tylko, czy istnieje lepszy sposób na wykonanie tego lub jakiegoś sposobu krzyżowania zapytań domenowych, aby uzyskać komponenty MEF