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

时间:2013-06-13 17:02:07

标签: c# .net assembly-binding-redirect

我正在尝试降级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>

我也试过代码库:

<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文档,没有提到以向后方式使用此功能。这可能吗?

4 个答案:

答案 0 :(得分:4)

我实际上正在使用你的第一个语句用于一些互操作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>

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

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

答案 1 :(得分:2)

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

  

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

引用newVersion的{​​{1}}属性。同样在&#34;备注&#34;部分:

  

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

他们的例子是:

bindingRedirect

我确实注意到它也提到了Explicit assembly binding redirection in an application configuration file requires a security permission的某些内容,也许这会对你产生影响吗?

答案 2 :(得分:1)

如果我没有弄错你,我已经使用stimulsoft报告DDL做了同样的事情,我安装了最新版本,但我想在我的应用程序中使用2010.3。但不是通过配置文件和重定向: 我只是从解决方案资源管理器中删除了引用并添加了旧的DLL引用,然后我设置了复制本地属性并重新编译,以便DLL将应用程序放在同一目录中,每个工作正常。也可以和其他一些dll一起完成。

答案 3 :(得分:1)

上面的答案是很好的答案,但它们缺少重要的部分。如果您阅读评论,一些开发人员不再相信这是有效的。实际上,这是有效的,可以双向工作,向上版本或向下工作

重要提示:文化

在我的实验中,只有当我将文化设置为中性时才开始工作。 (上面的例子有&#39; en-us&#39;)

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

在我的设置中,我WinApp引用了Lib1Lib3Lib1引用Lib2Lib3Lib2引用Lib3。当我按下按钮时,一个调用从WinApp一直传播到Lib3(直接和通过lib链),并在屏幕上显示文本返回。 Lib3名字很强。

运行1 - 没有文化集[assembly: AssemblyCulture("")],没有绑定重定向集 - WORKS!

运行2 - Lib3中的较低版本,将绑定重定向设置为&#39; en-us&#39; - 失败!

运行3 - Lib3中的较低版本,将绑定重定向设置为&#39;中性&#39; - 工作!适用于版本和版本。

在其他游戏中 - 玩设置[assembly: AssemblyCulture("en-us")] - 当AssemblyCulture不为空时,所有尝试都失败。实际上,在WinApp中设置此属性时,它甚至不会编译

  

错误CS7059:可执行文件不能是附属程序集;文化应该永远是空的

所以,我们走了。由于我不理解AssemblyCulture所有错综复杂的角色,我只声称我的实验只能证明在特定条件下版本重定向工作正常。