.Net加载项和版本控制

时间:2009-06-10 09:14:08

标签: c# .net plugins add-in

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

在加载时,我们搜索插件目录,加载目录中的所有程序集,在程序集中搜索实现IPlugin的类型,并在插件的实例上执行initialiaztion例程。我知道这不是最强大的设计(例如:我们可能希望稍后查看appdomain隔离插件),但它现在可以正常工作。

目前看来,这似乎工作得很好,除了一个很大的警告。

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

我想到了这个问题的一些解决方案(请注意程序集在GAC中):

  1. 发布带有mediabrowser.dll的发布者策略,该策略会将所有早期兼容版本的mediabrowser.dll重定向到当前版本(这也必须存在于GAC中)。
  2. 发布一个包含所有固定扩展点和合同的单独程序集,对于更改此程序集要格外谨慎,让插件编写者链接到此程序集。 (但仍然考虑使用发布者策略来对接口进行不间断的更改)
  3. 让第三方担心这些问题,并利用MEF或其他一些处理此类问题的框架。
  4. Hookup AppDomain.CurrentDomain.AssemblyResolve并将程序集的早期版本解析为当前版本。这仅在特定版本的程序集不在GAC中时才有效。
  5. 我缺少这个问题的其他解决方案吗?

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

1 个答案:

答案 0 :(得分:1)

我看到你已经选择了一个答案,但是如果你仍然对想法持开放态度还有另外一个选择(.NET框架使用的那个):不要在构建之间增加程序集版本(但是增加你的程序集)建造数量)。

这将允许您的程序集保留其相同的强名称,而不是破坏插件compat,并且仍允许您区分构建(使用程序集内部版本号)。

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

只要你不破坏你的界面合约(你永远不应该这样做),这种方法是非常合理的。