2009-06-10 67 views
4

我们的媒体中心加载项作为一个驻留在GAC(mediabrowser.dll)中的DLL提供,我们允许用户通过引用我们的DLL和访问来为我们的加载项编写扩展预定义的可扩展性点。.Net加载项和版本号

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

就目前来看,这似乎工作正常,除了一个大的警告。

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

我已经想了几个解决方案,这个问题(注意程序集是在GAC):

  1. 船舶与mediabrowser.dll发行者策略将重定向mediabrowser.dll的所有早期版本兼容到当前版本(这也必须在GAC中)。
  2. 运送一个单独的程序集,其中包含所有固定的扩展点和合同,对于更改此程序集要格外谨慎,让插件作者链接此程序集。 (但仍然着眼于使用发布者策略对接口进行非重大更改)
  3. 让第三方担心这个问题,并利用MEF或其他一些处理此类内容的框架。
  4. Hookup AppDomain.CurrentDomain.Assembly将程序集的早期版本解析并解析为当前版本。这只有在该特定版本的程序集不在GAC中时才有效。

是否有任何其他解决方案来解决这个问题?

更新我结束了选项去4.

+0

+1。但是你可能想改变这个问题的标题,使它更清晰一些? – 2009-06-11 08:15:28

+0

我正在为标题苦苦挣扎。任何人都可以拿出更好的?只要继续编辑这个,没有难过的感觉。 – 2009-06-11 08:16:31

回答

1

我看你已经选择一个答案,但如果你仍然是开放的思路还有另外一个值得考虑的选择(非常一个由.NET框架中使用):不要在两个版本之间增加汇编版本(但要增加汇编版本号)。

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

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

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