将程序集绑定重定向到较低版本

16

我正在尝试将NServiceBus的依赖项从4.0.0.0降级到2.5.0.0

我已经尝试了以下几种方法,但都似乎不起作用。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="NServiceBus"
                              publicKeyToken="9fc386479f8a226c" culture="neutral"/>
            <bindingRedirect oldVersion="4.0.0.0" newVersion="2.5.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

我也尝试了使用 codebase:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="NServiceBus"
                              publicKeyToken="9fc386479f8a226c"
                              culture="neutral"/>
            <codeBase version="2.5.0.0" href="NServiceBus.dll"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

但是,仍然一无所获。我查看了msdn文档,没有提到可以以反向方式使用此功能。这可能吗?


如果允许程序集重定向,即使如此,如果它实际上能够工作,我也会感到非常惊讶。我建议使用两个版本构建自己的强名称程序集,并首先在简单示例上尝试使其工作。 - Alexei Levenkov
是的,SO上的一些答案表明这是可能的,但我感觉没有人真正尝试过。最终我可能会用自己的库来尝试。 - Kostas Konstantinidis
我不知道这是否相关,但您是否尝试在<dependentAssembly>元素中另外包含<publisherPolicy apply="no" /> - Jehof
是的,我尝试禁用 publisherPolicy,但遗憾的是没有效果。 - Kostas Konstantinidis
哈!好的,我刚刚完成了。现在回顾一下,再添加一些上下文。NServiceBus有一些依赖程序集无法加载。在任何其他情况下,如果依赖项在执行文件夹中可用,我的第一个示例可能会起作用! - Kostas Konstantinidis
4个回答

7

我们公司的客户在Office更新方面有不同的状态,因此我实际上正在使用您的第一个语句来处理一些Interop DLL。这是我使用的代码:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="office" publicKeyToken="71E9BCE111E9429C" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>

这提供了从DLL的14版本到11版本的向后兼容性。您能提供您正在使用的DLL的链接吗?

我已经下载了NServiceBus框架(版本3.3.8)并使用ILSpy调查了DLL。我建议您用您的DLL做同样的事情。对于我的DLL,它向我显示与你的相同的公钥令牌。您确定您使用的是4.0.0.0版本而不是3.3.0.0版本吗?或者您可能错配了公钥令牌。


2

上面的回答都是好的回答,但是它们缺少重要部分。如果你阅读评论,一些开发人员不再相信这个方法是有效的。事实上,这个方法是有效的,并且可以向上版本或向下版本兼容。

重要提示:文化

在我的实验中,只有当我将文化设置为中性时,它才开始起作用。(上面的示例使用 'en-us')

<assemblyIdentity name="..... culture="neutral"/>

在我的设置中,我有一个引用了Lib1Lib3WinAppLib1引用了Lib2Lib3Lib2引用了Lib3。当我按下按钮时,从WinAppLib3(直接或通过库链)传播了一个调用,并在屏幕上显示了文本。 Lib3是强命名的。
运行1 - 没有设置区域设置[assembly: AssemblyCulture("")],没有设置绑定重定向 - 正常工作!
运行2 - 在Lib3中降低版本,将绑定重定向设置为'en-us' - 失败!
运行3 - 在Lib3中降低版本,将绑定重定向设置为'neutral' - 正常工作!可以向上和向下升级。
在其他运行中 - 尝试设置[assembly: AssemblyCulture("en-us")] - 当AssemblyCulture不为空时,所有尝试都失败了。实际上,在 WinApp 中设置此属性时,甚至无法编译。
错误CS7059:可执行文件不能是卫星程序集;culture应始终为空
所以,我们来吧。由于我不理解AssemblyCulture的所有复杂性,我只声称我的实验仅证明在特定条件下版本重定向正常工作。

2
根据MSDN:https://msdn.microsoft.com/en-us/library/eftw1fys(v=vs.110).aspx

此值可以指定早于 oldVersion 的版本。

这是针对 bindingRedirectnewVersion 属性。在“备注”部分中还有以下说明:

您还可以将程序集从较新的版本重定向到较旧的版本。

他们的示例是:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

我注意到它也提到了关于应用程序配置文件中的显式程序集绑定重定向需要安全权限,也许这也会影响你?


1
如果我没有理解错的话,我也曾经在使用最新版本的stimulsoft报表DDL时,想要在我的应用程序中使用2010.3版本,而不是通过配置文件和重定向来实现。我只需从解决方案资源管理器中删除引用,添加旧的DLL引用,然后设置“复制本地”属性并重新编译,以便DLL与应用程序一起放置在同一目录中,一切正常运作。我还以同样的方式处理了其他一些DLL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接