尽管具有程序集重定向和加载正确的版本,但程序集不匹配

时间:2014-08-10 11:29:30

标签: .net .net-assembly

我的控制台应用使用依赖于Newtonsoft.Json v4.5.0.0的System.Net.Http.Formatting v5.1.0.0。我的应用程序包括Newtonoft.Json的v6.0.0.0(由于其他原因)。

要使System.Net.Http.Formatting使用新的Newtonsoft.Json版本,我将程序集重定向添加到App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我仍然遇到以下异常:

A first chance exception of type 'System.IO.FileLoadException' occurred in System.Net.Http.Formatting.dll

Additional information: Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

融合日志显示加载了正确的程序集但由于不匹配而失败:

*** Assembly Binder Log Entry  (2014.08.10. @ 13:13:25) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  D:\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
 (Fully-specified)
LOG: Appbase = file:///D:/ConsoleApplication1/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConsoleApplication1.exe
Calling assembly : System.Net.Http.Formatting, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///D:/ConsoleApplication1/bin/Debug/Newtonsoft.Json.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\ConsoleApplication1\bin\Debug\Newtonsoft.Json.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

我该怎么做才能解决这种不匹配问题?提前谢谢。

解决方案

重定向没有错。唯一的线索是它以某种方式甚至没有被应用,虽然看似一切都按预期工作(请注意,日志甚至显示正确的配置文件已加载)。问题是assemblyBinding部分中有关于另一个程序集问题的声明:

<qualifyAssembly partialName="log4net" fullName="log4net, 1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

这条线解决了其他问题,但不知何故打破了Json重定向。我不知道为什么:qualifyAssembly声明也应该是正确的。

尽管如此,删除此声明会使程序集重定向工作......

2 个答案:

答案 0 :(得分:6)

没有证据表明您的<bindingRedirect>生效了。你应该看到:

LOG: Redirect found in application configuration file: 4.5.0.0 redirected to 6.0.0.0.
LOG: Post-policy reference: Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed

您的问题中没有面包屑,但无论您编辑的内容似乎都不是D:\ ConsoleApplication1 \ bin \ Debug \ ConsoleApplication1.exe.Config。奇怪的驱动器号。注意已经有App.config项目项目并添加App1.config的项目。这样的事情。

答案 1 :(得分:5)

只是想在这里添加一些额外的细节,因为这是一个特别令人讨厌的问题,大蒜,银子弹和圣水供不应求。

我们最近遇到了这个问题,发现原因是app.config中的模式违反了XML,这是因为自动合并错误导致的,例如。

<dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
        <assemblyIdentity name="Microsoft.Extensions.FileProviders.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>

我们没有注意到文件中的问题,因为它仍然是技术上有效的XML并且Visual Studio解析器从不抱怨。

然而,运行时绑定例程拒绝应用任何绑定重定向(甚至是在格式错误的部分之外声明的绑定重定向)。此外,如上所述,在融合日志中没有指示运行时未能解析配置文件。它会看到正确的dll和配置文件位置,但仍然会出现次要版本差异,就好像从未应用任何重定向一样。

TL; DR - 如果您遇到此问题,请检查您的配置文件XML是否完美无瑕 - 并且不要相信那些波浪线VS将揭示每一个可能的问题。