Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plugins winforms的MEF插件更新策略_Plugins_Mef_Versioning - Fatal编程技术网

Plugins winforms的MEF插件更新策略

Plugins winforms的MEF插件更新策略,plugins,mef,versioning,Plugins,Mef,Versioning,我正在用MEF开发一个可扩展的应用程序。该应用程序将有许多类型的插件以不同的方式收集和处理数据 我正在考虑为插件构建一个版本化的在线存储库,当插件的新版本可用时,用户可以下载这些插件的新版本 如果MEF可以同时加载同一个插件的不同版本就好了,尽管据我所知这是不可能的(如果我错了,请纠正我) 因此,我不得不承认,我需要更新插件并归档以前的版本 这样做的最佳策略是什么 例1 应用程序将下载已加载的运行插件的新版本。我无法将插件放在插件目录中,因为已经有同名的DLL。因此,我可以用版本后缀重命名新插件

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

我正在考虑为插件构建一个版本化的在线存储库,当插件的新版本可用时,用户可以下载这些插件的新版本

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

因此,我不得不承认,我需要更新插件并归档以前的版本

这样做的最佳策略是什么

例1

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

---这看起来有点混乱

例2

应用程序将下载已加载的运行插件的新版本。 插件被封装在某种类型的安装程序中。 安装程序优雅地关闭主机并归档现有插件。 安装程序安装新插件并重新启动主机应用程序

---这看起来也有点乱


我正在寻求对我的假设的任何更正,或对实现我的目标的成功战略的任何洞察。

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

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

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

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

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

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

    请以此为例。

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