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

问题描述 投票:0回答:4

我正在尝试降级 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 文档,没有提到以“向后”的方式使用此功能。这可能吗?

c# .net assembly-binding-redirect
4个回答
8
投票

<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。或者您可能与公钥令牌不匹配。


3
投票
https://msdn.microsoft.com/en-us/library/eftw1fys(v=vs.110).aspx

该值可以指定比oldVersion更早的版本。

指的是
newVersion

bindingRedirect
属性。同样在“备注”部分:

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

他们的例子是:

<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>

我确实注意到它还提到了一些有关
应用程序配置文件中的显式程序集绑定重定向需要安全权限

,也许这也会影响您?


3
投票
这是双向的,向上版本或向下版本

重要:

文化

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

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

在我的设置中,我有 
WinApp

引用了

Lib1
Lib3
Lib1
参考
Lib2
Lib3
Lib2
参考文献
Lib3
。当我按下按钮时,一个调用从
WinApp
一路传播到
Lib3
(直接传播和通过库链传播),并且文本返回显示在屏幕上。
Lib3
的名字很强大。

运行 1 - 未设置区域性

[assembly: AssemblyCulture("")]

,未设置绑定重定向 - 有效!


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

运行 3 - Lib3 中的较低版本,将绑定重定向设置为“中性” - 有效!适用于向上版本和向下版本。

在其他运行中 - 使用设置

[assembly: AssemblyCulture("en-us")]

- 当

AssemblyCulture
不为空时,所有尝试都会失败。事实上,当在
WinApp
中设置这个属性时,它甚至无法编译

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

所以,我们开始吧。由于我不明白
AssemblyCulture

的所有复杂作用,我只声称我的实验仅证明在特定条件下版本重定向工作正常。

    


1
投票

© www.soinside.com 2019 - 2024. All rights reserved.