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

时间:2017-04-12 09:34:22

标签: c# assembly-binding-redirect

这不是一个问题问题,而是关于装配绑定重定向工作的一般性理解问题。

查询

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

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

2 个答案:

答案 0 :(得分:94)

为什么需要绑定重定向?假设您有引用库B的应用程序A,以及版本1.1.2.5的库C.库B反过来也引用库C,但是引用版本1.1.1.0。现在我们遇到了冲突,因为您无法在运行时加载同一程序集的不同版本。要解决此冲突,您可以使用绑定重定向,通常使用新版本(但也可以使用旧版本)。您可以通过在configuration > runtime > assemblyBinding部分下面的应用程序A的app.config文件中添加以下内容(有关完整配置文件的示例,请参阅here):

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

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

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

答案 1 :(得分:18)

我们遇到了有关NewtonSoft.Json的绑定重定向的问题。我们在win 10文件属性“ 9.0.1.19813”中查找了文件版本,查找了编号,并且重定向一直失败。进一步调查发现,我们正在查看文件版本,而不是程序集版本。因此,我想知道人们是否误以为文件版本(经常更改)和程序集版本(在Windows 10 File Explorer中看不到)。要查看dll的程序集版本,可以在powershell中运行它。 用您要为其查找版本的dll名称替换。

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

上面的结果是。

Major  Minor  Build  Revision

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

9      0      0      0

请参阅参考文献:

How can i see the assembly version of a .NET assembly in Windows Vista and newer (WIndows 7, 2008)?

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

enter image description here