c# - .Net 插件和版本控制

标签 c# .net plugins add-in

我们的媒体中心加载项作为位于 GAC (mediabrowser.dll) 中的单个 DLL 提供,我们允许用户通过引用我们的 DLL 和访问预定义的扩展点来为我们的加载项编写扩展。

加载时,我们搜索插件目录,加载目录中的所有程序集,在程序集中搜索实现 IPlugin 的类型,并在插件实例上执行初始化例程。我知道这不是最健壮的设计(例如:我们可能想稍后查看插件的应用程序域隔离)但它现在工作正常。

就目前而言,这似乎工作正常,除了一个重要的警告。

当插件编写者编译他们的插件时,插件会引用特定版本的 mediabrowser.dll。稍后当我们修改我们的 dll(修复错误或添加功能)时,所有针对早期版本的 mediabrowser.dll 编写的插件都会中断。

我想到了几个解决这个问题的方法(注意程序集在GAC中):

  1. 发布一个带有 mediabrowser.dll 的发布者政策,将所有早期兼容版本的 mediabrowser.dll 重定向到当前版本(这也必须存在于 GAC 中)。
  2. 发布一个单独的程序集,其中包含所有固定的扩展点和契约,在更改此程序集时要格外谨慎,让插件作者链接到此程序集。 (但仍然考虑使用发布者策略对界面进行非破坏性更改)
  3. 让第三方来担心这些事情,并利用 MEF 或其他一些框架来处理此类事情。
  4. 连接 AppDomain.CurrentDomain.AssemblyResolve 并将程序集的早期版本解析为当前版本。这仅在该特定版本的程序集不在 GAC 中时才有效。

对于这个问题,我还缺少其他解决方案吗?

更新 我最终选择了选项 4。

最佳答案

我看到你已经选择了一个答案,但如果你仍然对想法持开放态度,则可以考虑另一种选择(.NET 框架使用的那个):不要在构建之间增加你的程序集版本(但要增加你的程序集内部编号)。

这将允许您的程序集保留相同的强名称,不会破坏插件兼容性,并且仍然允许您区分彼此的构建(使用程序集构建号)。

您可以在 .NET 2.0 到 3.5 中看到这一点。这些版本都使用程序集版本 2.0.50727,但具有不同的构建版本。

只要您不违反接口(interface)约定(无论如何您都不应该这样做),这种方法就非常合理。

关于c# - .Net 插件和版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/974495/

相关文章:

c# - OWIN Startup 类与 WebAPIConfig.Register 方法一起执行

.net - 南希 : use array of data from POST request

java - 如何将自定义插件发布到Maven本地,然后在另一个本地项目中使用?

plugins - 如何安装一些额外的 uWSGI 插件?

c# - 对包含新添加的自定义类型的列表进行排序

C# DDD 填充不可变对象(immutable对象)

c# - 交换数组中的对象 - C#

c# - 如何显示动态生成的图像

.net - 适用于 Windows 7 的 Epson OPOS ADK for .NET 驱动程序

asp.net-mvc - 如何将 ASP.NET MVC 用户控件构建到类库中