MEF插件更新策略适用于WinForms

3
我正在使用MEF开发一个可扩展的应用程序。该应用程序将有多种类型的插件,用于以不同的方式收集和处理数据。
我考虑构建一个版本化的在线插件库,使用户能够在插件有新版本时下载新版插件。
尽管从我了解到的情况来看这似乎不可能(如果我错了请纠正我),但如果MEF可以同时加载相同插件的不同版本会很好。
所以我已经接受了这个事实:我需要更新插件并归档先前的版本。
那么,做到这一点的最佳策略是什么?
示例1
应用程序下载了正在运行的插件的新版本。由于已经有一个具有相同名称的DLL文件,因此无法将新插件放置在插件目录中。因此,我可以使用版本后缀重命名新插件。我不能加载同一程序集,因此我猜我必须强制重新启动。因此,在重新启动后,它将删除旧插件并加载新插件。
--- 这个解决方案似乎有点混乱。
示例2
应用程序下载了正在运行的插件的新版本。插件被包含在某种类型的安装程序中。安装程序会正常关闭主机并归档现有插件。安装程序然后安装新插件并重新启动主机应用程序。
--- 这也似乎有点混乱。
我正在寻求对我的假设的任何更正,或针对实现我的目标的成功策略的任何见解。
1个回答

3

.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 以获取示例。


感谢您详尽的回答和提供的链接,非常有启发性,满分 :) - TheGeneral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接