{C#} MEF如何在运行时替换插件

主要是利用AppDomain的ShadowCopy特性。

        var setup = new AppDomainSetup
        {
            CachePath = cachePath,
            ShadowCopyFiles = "true",
            ShadowCopyDirectories = pluginPath
        };

之后创建程序集

        domain = AppDomain.CreateDomain("Host_AppDomain", AppDomain.CurrentDomain.Evidence, setup);
        var asmfullname = typeof(UseConfig).Assembly.FullName;
        var typefullname = typeof(UseConfig).FullName;
        useConfig = (UseConfig)domain.CreateInstanceAndUnwrap(asmfullname, typefullname);
        useConfig.Build();

在创建好的程序集里通过MEF加载插件

    useConfig.cs:
    public void Build()
    {
        var regBuilder = new RegistrationBuilder();
        regBuilder.ForTypesDerivedFrom<IConfig>().Export<IConfig>();

        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(UseConfig).Assembly, regBuilder));
        directoryCatalog = new DirectoryCatalog(pluginPath, regBuilder);
        catalog.Catalogs.Add(directoryCatalog);

        container = new CompositionContainer(catalog);
        container.ComposeExportedValue(container);

        configs = container.GetExportedValues<IConfig>();
    }

替换插件有两种情况

  1. 先删除后添加
    刷新一下,重新输出。
    public void Recompose()
    {
    directoryCatalog.Refresh();
    container.ComposeParts(directoryCatalog.Parts);
    configs = container.GetExportedValues<IConfig>();
    }

  2. 直接替换
    通过FileWatch监视,一旦有文件变化Unload AppDomain,然后重新加载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,591评论 7 249
  • 哭牦牛 我小小的案头,摆放着一个工艺品——小牛犊。它是陶瓷做的,全身光滑锃亮。粗略看...
    山之尖阅读 391评论 1 1
  • 带着期待与伤痛来到九型,刚开始老师让我们临在因为经常焦虑很难做到,慢慢找到答案原来我是脑区的。永远依赖思想来回应事...
    谢莉6阅读 149评论 0 2