【发布时间】:2009-06-10 09:14:07
【问题描述】:
我们的媒体中心插件作为一个单独的 DLL 提供,它存在于 GAC (mediabrowser.dll) 中,我们允许用户通过引用我们的 DLL 并访问预定义的扩展点来为我们的插件编写扩展。
在加载时,我们搜索插件目录,加载目录中的所有程序集,在程序集中搜索实现 IPlugin 的类型并在插件实例上执行初始化例程。我知道这不是最健壮的设计(例如:我们可能想稍后查看插件的 appdomain 隔离),但它现在可以正常工作。
就目前而言,这似乎工作正常,除了一个重要的警告。
当插件编写者编译他们的插件时,插件会引用具有特定版本的 mediabrowser.dll。稍后,当我们修改我们的 dll(以修复错误或添加功能)时,针对早期版本的 mediabrowser.dll 编写的所有插件都会中断。
我已经想到了一些解决这个问题的方法(注意程序集在 GAC 中):
- 使用 mediabrowser.dll 提供发布者策略,将所有早期兼容的 mediabrowser.dll 版本重定向到当前版本(这也必须存在于 GAC 中)。
- 发送包含所有固定扩展点和合同的单独程序集,更改此程序集时要格外谨慎,让插件编写者链接到此程序集。 (但仍然考虑使用发布者策略对接口进行非破坏性更改)
- 让第三方担心这些事情,并利用 MEF 或其他处理这类事情的框架。
- 连接 AppDomain.CurrentDomain.AssemblyResolve 并将程序集的早期版本解析为当前版本。这仅在该特定版本的程序集不在 GAC 中时才有效。
对于我缺少的这个问题还有其他解决方案吗?
更新我最终选择了选项 4。
【问题讨论】:
-
+1。但是您可能想更改此问题的标题以使其更清晰一点?
-
我在为标题而苦苦挣扎。有人能想出更好的吗???继续编辑这个,没有难过的感觉。