我们的媒体中心加载项作为一个驻留在GAC(mediabrowser.dll)中的DLL提供,我们允许用户通过引用我们的DLL和访问来为我们的加载项编写扩展预定义的可扩展性点。.Net加载项和版本号
在加载时,我们通过插件目录搜索,加载目录中的所有程序集,在程序集中搜索实现IPlugin的类型,并在插件的实例上执行initialiaztion例程。我知道这不是最稳健的设计(例如:我们可能想在稍后查看appdomain隔离插件),但它现在可以正常工作。
就目前来看,这似乎工作正常,除了一个大的警告。
当插件编写者编译插件时,插件引用mediabrowser.dll与特定版本。稍后当我们修改我们的DLL(修复错误或添加功能)时,所有针对mediabrowser.dll break的早期版本编写的插件。
我已经想了几个解决方案,这个问题(注意程序集是在GAC):
- 船舶与mediabrowser.dll发行者策略将重定向mediabrowser.dll的所有早期版本兼容到当前版本(这也必须在GAC中)。
- 运送一个单独的程序集,其中包含所有固定的扩展点和合同,对于更改此程序集要格外谨慎,让插件作者链接此程序集。 (但仍然着眼于使用发布者策略对接口进行非重大更改)
- 让第三方担心这个问题,并利用MEF或其他一些处理此类内容的框架。
- Hookup AppDomain.CurrentDomain.Assembly将程序集的早期版本解析并解析为当前版本。这只有在该特定版本的程序集不在GAC中时才有效。
是否有任何其他解决方案来解决这个问题?
更新我结束了选项去4.
+1。但是你可能想改变这个问题的标题,使它更清晰一些? – 2009-06-11 08:15:28
我正在为标题苦苦挣扎。任何人都可以拿出更好的?只要继续编辑这个,没有难过的感觉。 – 2009-06-11 08:16:31