程序集绑定重定向:如何和为什么?

187

这不是一个问题,而是有关程序集绑定重定向工作原理的一般理解问题。

疑问

  1. 为什么绑定重定向只显示主要版本而不显示次要版本、构建和修订号?
  2. 只有在主要版本发生变化时,旧版和新版才会发生变化吗?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>
    

3
它可以是任何版本,不仅仅是主要版本。例如:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" - Evk
1
@Evk:我看到的所有示例都只显示主要版本。 - Nikhil Agrawal
9
那只是举例子,没有说这是唯一可能的方式。 - Evk
3个回答

263

绑定重定向到底有什么用呢?假设你有一个应用程序 A,它引用库 B,同时还引用版本为 1.1.2.5 的库 C。而库 B 又引用了版本为 1.1.1.0 的库 C。现在我们遇到冲突了,因为你不能在运行时加载同一程序集的不同版本。要解决这个冲突,你可以使用绑定重定向,通常是到新版本(也可以是旧版本)。你可以通过在应用程序 A 的 app.config 文件中添加以下内容来实现此操作,在 configuration > runtime > assemblyBinding 部分下(请参见这里以获取完整配置文件示例):

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

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

您还可以指定一系列版本进行映射:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

现在,编译时使用C版本1.1.1.0作为参考的B库,在运行时将使用C版本1.1.2.5。当然,您最好确保C库向后兼容,否则可能会导致意外结果。

您可以重定向任何库的版本,不仅仅是主要版本。


3
在应用程序A的配置文件中,它们没有任何影响(就我所知),除非这个库是单元测试库,并且在某种意义上被单元测试运行器“执行”。 - Evk
1
@AlexanderDerck 几周前有一个问题,得到了很多赞和悬赏,正是在问这个问题,但是没有人能够提供令人信服的答案 - https://dev59.com/M1YM5IYBdhLWcg3wxiYy - Evk
1
一个重要的通知(我之前并不知道)。根据这个答案,新旧两个程序集必须具有相同的PublicKeyToken,否则重定向将无法正常工作。 - Mohammed Noureldin
1
你不能在运行时加载同一程序集的不同版本 - 为什么不修复这个问题,而要使用所有这些重定向垃圾呢? - Paul McCarthy
2
@PaulMcCarthy 我认为.NET团队知道这是垃圾。幸运的是,他们没有将这个“功能”带到.NET Core中。https://nickcraver.com/blog/2020/02/11/binding-redirects/ - Mariusz Pawelski
显示剩余15条评论

110

在使用NewtonSoft.Json时,我们遇到了绑定重定向的问题。我们查看了win 10文件属性中的文件版本“9.0.1.19813”,查找了这个数字,但重定向仍然失败。进一步调查发现,我们看的是文件版本,而不是程序集版本。因此,我想知道人们是否将文件版本(经常更改)和程序集版本(无法在Windows 10文件资源管理器中查看)混淆了。

要查看dll的程序集版本,您可以在PowerShell中运行以下命令。 请将dll名称替换为您要查找版本的名称。

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

以上的结果是。

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

参考资料:

如何在Windows Vista及更高版本(Windows 7、2008)中查看.NET程序集的程序集版本?

https://support.microsoft.com/en-nz/help/556041

输入图像描述


0
我强烈推荐使用JetBrains的dotPeek来查看dll库及其版本。 根据您的第二个问题,版本可能完全不同,不仅仅是主要版本计数。 输入图像描述

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