可能需要Json.NET v 4.5 bug的NodaTime.Serialization.JsonNet?

时间:2014-04-22 01:10:36

标签: json.net nodatime

我发现与NodaTime相关的旧帖子需要Json.Net v4.5,但这是固定的。我似乎看到了与NodaTime.Serialization.JsonNet相同的事情。

重现此错误的最简单方法:通过在我的解决方案中添加和删除NodaTime.Serialization.JsonNet(通过NugGet)到VS项目,我得到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(fyi):

<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转换器添加到序列化程序实例,则会发生同样的错误。因此,具体而言,我无法通过添加转换器。我无法进入添加转换器的辅助方法,而不会遇到程序集加载异常。

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

我要将源代码添加到我的项目中(与此测试项目相比)并重新编译以查看是否可以解决问题。

更新

当我加载“全部”解决方案(源代码)并尝试构建时,我发现了下面的警告。作为一个实验,我将目标(.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“其当前目标框架中的版本”2.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

1 个答案:

答案 0 :(得分:0)

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

  

主要参考&#34; NodaTime.Serialization.JsonNet,Version = 1.2.0.0,Culture = neutral,PublicKeyToken = 4226afe0d9b296d1,processorArchitecture = MSIL&#34;无法解决因为它对程序集具有间接依赖性&#34; Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed&#34;这是根据&#34; .NETFramework,Version = v4.0,Profile = Client&#34;框架。这是一个比当前目标框架更高的版本&#34; .NETFramework,Version = v3.5&#34;。

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

因此,如果您需要定位.Net 3.5,请使用Json.Net 5.0.8。如果您可以定位.Net 4.0或更新版本,那么您可以使用最新版本的Json.Net。