gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:53:59 25 4
gpt4 key购买 nike

我们的媒体中心加载项作为位于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com