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


126

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

查询

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

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

它可以是任何版本,而不仅仅是主要版本。例如:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk:我看到的所有示例仅显示主要版本。
Nikhil Agrawal

4
好吧,这些只是示例,没有地方说这是唯一可行的方法。
Evk

Answers:


165

为什么根本需要绑定重定向?假设您有引用库B的应用程序A,还引用了版本1.1.2.5的库C。库B依次也引用库C,但版本为1.1.1.0。现在我们有了冲突,因为您无法在运行时加载同一程序集的不同版本。要解决此冲突,您可以使用绑定重定向,通常是重定向到新版本(但也可以是旧版本)。您可以通过将以下内容添加到应用程序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" />  

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

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


这些文件放入什么文件以及在什么部分下?有人可以提供指向MSDN或类似来源的链接以供参考吗?记住,人们会从搜索引擎的各个领域访问您的SO Q / A文章,因此参考文献至关重要。我有一个同事告诉我,在休假一周之前,“只是将程序集重定向添加到您的exe文件中”,我降落在这里,尽管此答案看起来不错,但缺少上下文和参考。
tpartee

有效问题@tpartee,我已经编辑了答案(等待同行评审),以包括config部分和docs.microsoft.com/zh-cn/dotnet/framework/configure-apps/
Kobus Smit

1
应用程序A的配置文件中的@AlexanderDerck-它们对库的配置文件没有影响(据我所知),除非该库是单元测试库并且在某种意义上被单元测试运行器“执行”。
Evk

1
@AlexanderDerck有一个问题,几个星期前,有许多upvotes,甚至赏金,这是问正是这样,但没有人能够提供让人信服的答案- stackoverflow.com/q/48377474/5311735
EVK

1
@CodeEngine publicKeyToken标识程序集C。只有签名的程序集才具有标识它们的公共密钥令牌。这是一个有关如何在给定装配后如何找到该令牌的问题:stackoverflow.com/q/3045033/5311735
Evk

55

我们遇到了与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

请参阅参考资料:

我如何在Windows Vista和更高版本(WIndows 7,2008)中看到.NET程序集的程序集版本?

https://support.microsoft.com/zh-CN/help/556041

在此处输入图片说明


12
支持提出文件版本和程序集版本之间的差异!
MRID
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.