我正在考虑通过提供一些预定义的接口来增加一些现有应用程序的可扩展性,这些接口可以通过在特定位置放置并由应用程序拾取的“插件”实现。应用程序的核心很少更新,而插件更新和部署更频繁。加载程序集和版本
所以基本上,有这样的设置:
// in core assembly (core.dll)
public interface IReportProvider{
string GenerateReport();
}
// in other assembly(plugin.dll)
public class AwesomeReport : IReportProvider {
string GenerateReport(){ ... }
}
两个项目都是相同的构建过程中的所有部分和核心应用被部署在其自身和插件都在后一阶段下降英寸
我的问题是随着时间的推移组装版本和解决方案。假设我们已经部署了core.dll v1,并且想要插入一个插件。如果plugin.dll引用的是core.dll v1,那么这个效果很好。但是,如果plugin.dll是针对更高版本的core.dll编译的(作为构建的一部分,比如说v2),插件无法加载,因为它引用的是core.dll v2,但部署的版本只有core.dll V1。
这是合理的和预期的行为,但它给了我这个项目已经建立的方式几个痛点,即开发/更新插件不能通过再次运行构建和放入新的插件(现在有更新的版本依赖关系)。我知道解决较旧的程序集到较旧的程序集中的潜在问题以及类型定义中潜在的不匹配问题仅仅在于解决高级别程序集解决问题,而不是解决与不匹配类型定义相关的问题。)
我看到一对夫妇的选项,把事情的工作,其中没有一个是一样简单,因为我真的想:
- 添加绑定重定向到web.config中,指示所有core.dll v1 +参考解析为core.dll v1引用
- 创建“contracts.dll”组件包含的接口定义,并保持在这个特定的程序集跨越不变的版本号建立
- 对core.dll的部署版本构建插件(不知引用在发展部署版本)
如上所述,这些都不是真正的低挂水果对我来说,我希望有人有一个更加困难的解决方案?
没有什么神奇的解决方案版本而这种DLL地狱。 CLR已经有了很好的保护,规避它应该是最后要考虑的事情。改为关注可靠的部署方案。 –
为什么“Contracts.dll”不简单?我认为这是一个很好的解决方案。合同库永远不会改变,core.dll和plugin.dll将用它作为通信的“中间件”。 –