MEF和ShadowCopying DLL,以便我可以在运行时覆盖它们

Not*_*ple 12 c# mef shadow-copy appdomain

我试图阻止我的应用程序锁定我的MEF插件目录中的DLL,以便我可以在运行时覆盖程序集(注意我实际上并没有尝试让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; }
    }
Run Code Online (Sandbox Code Playgroud)

然后通过此类上的CompositionContainer访问我的MEF组件目录.但是,组合容器似乎只在shadowcopy域内初始化(这是有意义的),这意味着它在我的应用程序域中为null.我只是想知道是否有更好的方法来做这个或某种方式跨域查询来获取我的MEF组件

Abh*_*jar -2

您是否可以选择不使用 DirectoryCatalog 并使用 AssemblyCatalog 加载目录中的所有程序集?您甚至可以转到代码 plex 并从 DirectoryCatalog 类复制相同的代码,该代码读取目录并加载程序集。

您将失去动态加载它们的能力,但正如您所提到的,这并不是真正的要求。