plugins - winform的MEF插件更新策略

标签 plugins mef versioning

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

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

如果 MEF 可以同时加载同一插件的不同版本,那就太好了,尽管据我了解这是不可能的(如果我错了,请纠正我)。

所以我已经接受了这样一个事实:我需要更新插件并存档以前的版本。

执行此操作的最佳策略是什么?

示例1

应用程序下载已加载运行插件的新版本。我无法将插件放在插件目录中,因为已经存在同名的 DLL。所以我可以用版本后缀重命名新插件。我无法加载相同的程序集,所以我想我必须强制重新启动。因此,重新启动时,它会实现旧插件并加载新插件。

--- 这个解决方案似乎有点困惑

示例2

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

---这看起来也有点困惑

我正在寻求对我的假设的任何修正,或对实现我的目标的成功策略的任何见解。

最佳答案

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

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

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

  1. GAC 中的强命名程序集。
  2. 名称中包含版本的程序集(如 Plugin.v1.dll)。在这种情况下,强命名是可选的,但仍然是一个好主意。这种方法的优点是插件的两个或多个版本可以共存于同一目录中。

看看这个 answer有关 MEF + 版本控制的示例。

您甚至可以使用 MEF 的重组功能并在之后更新您的插件容器:

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

看看这个 question举个例子。

关于plugins - winform的MEF插件更新策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169450/

相关文章:

javascript - JQuery 插件 - 重定向计时器出错

wpf - 哪个更适合与 Prism4、Unity 或 MEF 一起用作依赖注入(inject)容器?

linux - yocto 图像版本控制的最佳方法

docker - 在 docker 中使用环境变量

php - Wordpress 分页翻译

javascript - i18next 重新加载翻译,无需重新初始化

c++ - 如何使用动态加载函数(dlopen)操作/返回数据?

c# - MEF 从预先存在的属性中导出

asp.net-mvc-3 - Entity Framework 插件架构推荐

version-control - 源代码控制 : what version numbering should be used for branches?