1

我发现与 NodaTime 相关的旧帖子需要 Json.Net v4.5,但已修复。我似乎在 NodaTime.Serialization.JsonNet 上看到了同样的情况。

重现此错误的最简单方法:通过在我的解决方案中向 VS 项目添加和删除 NodaTime.Serialization.JsonNet(通过 NugGet),我得到 Json.Net v4.5 的运行时程序集绑定/加载错误(我有 v 6。 x) 已安装。当我删除 NodaTime.Serialization.JsonNet 时,一切都很好。

NodaTime 本身很好——只是当我添加 NodaTime.Serialization.JsonNet 时才会发生错误。

有没有其他人遇到过这个问题?

更多信息:

我进一步缩小了这个范围,并隔离了这个问题,以便它只在从 PowerShell 运行时中调用 WCF 方法时发生。NodaTime.Serialization.JsonNet 在仅限 WCF 的测试中工作得很好。

在调用“ConfigureForNodaTime”时,错误是:

无法加载文件或程序集“Newtonsoft.Json,Version=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。该系统找不到指定的文件。

我会继续看这个,但想提供一个更新。

附加信息:

=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
 (Fully-specified)
LOG: Appbase = file:///S:/_Jp/DevProjCommon/__TEST/__TEST/bin/x64/Debug/
LOG: Initial PrivatePath = NULL
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: S:\_Jp\DevProjCommon\__TEST\__TEST\bin\x64\Debug\TestApp.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
LOG: Attempting download of new URL file:///S:/_Jp/DevProjCommon/__TEST/__TEST/bin/x64/Debug/Newtonsoft.Json.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

app.config(仅供参考):

<dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>

乔恩,马特:

当我打开源代码时,NodaTime.Serialization.JsonNet 项目设置指的是 'C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\v2.3\ref\Newtonsoft.Json.dll', v4.0.30319, 4.5 .0.0,真

考虑到这些设置,也许在构建解析为该路径的 CS 项目文件时:

<ItemGroup Condition="'$(Portability)' == 'Desktop'">
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\..\lib\jsonnet\Net35\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition="'$(Portability)' == 'PCL'">
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\..\lib\jsonnet\Portable\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

如果我绕过“ConfigureForNodaTime”扩展方法,并尝试在辅助方法中将 NodaTime 转换器添加到序列化程序实例,则会发生相同的错误。因此,具体而言,我无法通过添加转换器。我无法在不遇到程序集加载异常的情况下进入添加转换器的辅助方法。

我还能够在 PowerShell 之外在引用我的 Web api 库和 Json.Net 序列化程序集的控制台应用程序中重现此内容。

我将把源代码添加到我的项目中(与这个测试项目相比)并重新编译,看看这是否能解决问题。

更新:

当我加载“全部”解决方案(源代码)并尝试构建时,我发现了下面的警告。作为实验,我将目标(.net)框架从 v3.5 客户端更改为 v4.5,警告消失了。

无法解析主要参考“Newtonsoft.Json,Version=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed,processorArchitecture=MSIL”,因为它间接依赖于 .NET Framework 程序集“System.Runtime.Serialization.Formatters” .Soap,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a",其版本"4.0.0.0"高于当前目标框架中的"2.0.0.0"版本。NodaTime.Serialization.JsonNet

更新:虽然我还没有确凿证据,但我可以确认摆脱 Nuget 依赖问题并不能缓解问题(我怀疑这个问题)。为了找到书挡,我将 Json.Net 和 NodaTime 的源代码添加到我的解决方案中以获得更大的控制权。

成功的解决方法是将 NodaTime 项目的目标框架更改为 .NET v4.5。v4.0 没用,v4.5 没用。这不是 NodaTime(我确实很喜欢,顺便说一句)本身的“修复”,因为其中一个目标是使其可用于可能不使用最新 .NET 框架版本的广泛应用程序。但它(我希望)是一个数据点,可能证明对诊断可能的变化很有用(如果其他人需要的话)。

我现在面临着相当大的时间压力,但我将承诺最终在我的特定案例中找到确凿的证据,以防万一其他人将来会遇到它。

最热烈的问候,Jp

4

1 回答 1

0

我只能在以 .Net 3.5 为目标并使用 Json.Net 6.0.1 或更高版本时重现此问题。在这种情况下,构建输出会告诉您问题:

无法解析主要参考“NodaTime.Serialization.JsonNet,Version=1.2.0.0,Culture=neutral,PublicKeyToken=4226afe0d9b296d1,processorArchitecture=MSIL”,因为它间接依赖于程序集“Newtonsoft.Json,Version=4.5。 0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”,它是针对“.NETFramework,Version=v4.0,Profile=Client”框架构建的。这是比当前目标框架“.NETFramework,Version=v3.5”更高的版本。

NuGet 将绑定重定向添加到您的配置文件,这解决了 .Net 4.0 及更高版本的问题,但似乎不适用于 .Net 3.5。

因此,如果您需要以 .Net 3.5 为目标,请使用 Json.Net 5.0.8。如果您可以针对 .Net 4.0 或更高版本,则可以使用最新版本的 Json.Net。

于 2014-04-26T00:48:01.687 回答