使用Prism,两个模块是否可以引用同一组件的不同版本?

时间:2014-02-20 22:14:29

标签: c# .net wpf prism .net-assembly

在我的公司,不同的团队正在开发基于WPF的同一产品的不同模块。一些模块引用相同的组件,例如Log4net,内部框架等...... 为了最大限度地减少影响,我们希望每个团队能够更新其模块引用的程序集的版本,而不必强制其他团队执行相同的操作。 Prism有可能吗?

1 个答案:

答案 0 :(得分:3)

这是可能的,但与Prism无关。您需要注意的是使用binding redirects

绑定重定向允许您指定对程序集的X版本的任何引用实际上应该使用版本Y.这样,不同的团队可以彼此分别更新它们的依赖项,但是在部署应用程序时,您可以配置绑定重定向到所有指向程序集的版本。

通常会将引用重定向到最新版本的程序集,该程序集未引入任何重大更改。中断更改可能会导致运行时出现异常。

以下是绑定重定向的示例:

<dependentAssembly>
    <assemblyIdentity name="OurInHouseLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />

    <bindingRedirect oldVersion="1.0.0.0-1.0.32.27762" newVersion="1.0.32.27762" />
</dependentAssembly>

这指定对版本OurInHouseLibrary到版本1.0.0.0的程序集1.0.32.27762的任何引用现在应该引用版本OurInHouseLibrary处的程序集1.0.32.27762。< / p>

我建议反对它,但另一种选择是使用codeBase元素重定向到不同的程序集,即:

<dependentAssembly>
    <assemblyIdentity name="OurInHouseLibrary" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />
    <codeBase version="1.0.0.0" href="v1.0\OurInHouseLibrary.dll" />
    <codeBase version="1.1.0.0" href="v1.1\OurInHouseLibrary.dll" />
</dependentAssembly>

Here是微软的一篇文章,解释了为什么加载同一个程序集的多个版本是一件坏事。其中一个主要问题是Type身份,因为您将无法使用一个版本中的类型代替另一个版本的类型(包括无法投射它们)。