用于winforms的MEF插件更新策略

时间:2013-03-02 01:02:32

标签: plugins mef versioning

我正在使用MEF开发可扩展的应用程序。该应用程序将有许多类型的插件以不同的方式收集和处理数据。

我正在考虑为插件构建一个版本化的在线存储库,这将使用户能够在插件可用时下载新版本。

如果MEF可以同时加载同一个插件的不同版本会很好,但据我所知,这是不可能的(如果我错了,请纠正我)

所以我已经辞职了,我需要更新插件并存档以前的版本。

这样做的最佳策略是什么?

示例1

应用程序下载新版本的已加载运行插件。 我不能将插件放在插件目录中,因为已经有同名的dll。 所以我可以使用版本后缀重命名新插件。 我不能加载相同的程序集,所以我想不得不强行重启。 所以在重新启动时,它会实现旧插件并加载新插件。

---这似乎解决方案看起来有点混乱

示例2

应用程序下载新版本的已加载运行插件。 该插件包含在某种类型的安装程序中。 安装程序正常关闭主机并存档现有插件。 安装程序会安装新插件并重新启动主机应用程序。

---这看起来有点乱 -

如果有人对我的假设有任何更正或煽动成功的策略来实现我的目标,那就是一个快乐的开发者

由于

1 个答案:

答案 0 :(得分:3)

.NET Framework有一个名为Shadow Copy的恐惧,它允许您更新加载的集合。基本上它将程序集复制到临时文件夹并从那里加载它们。这样,操作系统就不会锁定位于应用程序安装文件夹中的程序集,您可以更换它们。 ASP.NET,单元测试framweorks和许多其他应用程序使用阴影复制。

要启用此功能,您需要在新的AppDomain中加载应用程序,因为您无法在主AppDomain上启用卷影复制。您可以创建一个简单的加载器,它将创建AppDomain并在那里执行您的应用程序。这非常直截了当。有关MEF + Shadow Copy的示例,请查看Glenn Block的Way of MEF,特别是PartUpdatesInPlace示例。

现在,就版本控制而言,您需要能够在同一应用程序域中同时加载两个或更多版本的程序集。有两种方法可以做到这一点:

  1. GAC中的强名称程序集。
  2. 其名称中包含版本的程序集(如Plugin.v1.dll)。在这种情况下,强命名是可选的,但仍然是一个好主意。这种方法的优点是两个或更多版本的插件可以共存于同一目录中。
  3. 有关MEF +版本控制的示例,请查看此answer

    您甚至可以使用MEF的重组功能,并在以下情况下更新您的插件容器:

    • 添加了新的插件程序集
    • 删除插件程序集
    • 更换插件程序集

    请查看此question示例。