2014-04-22 98 views
1

我发现与NodaTime相关的旧帖子需要Json.Net v4.5,但这是固定的。我似乎看到与NodaTime.Serialization.JsonNet一样的事情。可能的NodaTime.Serialization.JsonNet需要Json.NET v 4.5 bug?

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

NodaTime本身就很好 - 它只是当我添加NodaTime.Serialization.JsonNet时发生错误。

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

一些详细信息:

我已经进一步缩小下来,并且将问题使得其仅当WCF方法是从PowerShell运行时内调用发生。 NodaTime.Serialization.JsonNet在仅WCF测试中工作得很好。

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

无法加载文件或程序集“Newtonsoft.Json,版本= 4.5.0.0,文化=中性 公钥= 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,True

建设解决给定的这条道路,这些设置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序列化程序集。

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

更新:

当我打开“所有”的解决方案(源),并尝试建立我发现下面的警告。作为一个实验,我从v3.5客户端将目标(.net)框架更改为v4.5,警告消失了。

无法解析主要引用“Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed,processorArchitecture = MSIL”,因为它对.NET Framework程序集“System.Runtime .Serialization.Formatters.Soap,版本= 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a“,它具有比当前目标框架中的版本”2.0.0.0“更高的版本”4.0.0.0“。 NodaTime.Serialization.JsonNet

更新: 虽然我还没有确凿的证据,我可以证实,摆脱的依赖的NuGet问题自己并没有缓解这个问题(即一个是在我的怀疑)。为了找到书夹,我将Json.Net和NodaTime的源代码添加到了我的解决方案中,以获得更好的控制。

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

我现在处于相当的时间压力之下,但我会承诺最终在我的特殊情况下找到吸烟枪,以防其他人在将来遇到它。

向那,JP

+0

如果没有看到错误信息,很难确切地说出错。 NuGet包只需要Json.NET> = 4.5.11,所以我希望它可以工作。你可以在一个微小的控制台应用程序中重现吗? –

+0

嗨,乔恩,你好吗,先生! – ivnext

+0

我无法在控制台应用程序中重现该问题,至少尚未。 这是一个相当复杂的应用程序(PowerShell二进制模块,WCF客户端等)。我进一步缩小了它的范围:执行'ConfigureForNodaTime'语句时发生异常。 这比我原来的评论更具体。 :)如果我注释掉该声明,则不会发生错误。 谢谢! -JP – ivnext

回答

0

瞄准NET 3.5的时候,用Json.Net 6.0.1或更高,我只能重现此问题。在这种情况下,生成输出告诉你这个问题:

The primary reference "NodaTime.Serialization.JsonNet, Version=1.2.0.0, Culture=neutral, PublicKeyToken=4226afe0d9b296d1, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the assembly "Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" which was built against the ".NETFramework,Version=v4.0,Profile=Client" framework. This is a higher version than the currently targeted framework ".NETFramework,Version=v3.5".

的NuGet增加了绑定重定向到您的配置文件,它解决了.NET 4.0和更高的问题,但似乎并没有为.NET工作3.5。

所以,如果你需要目标.net 3.5,然后使用Json.Net 5.0.8。如果你的目标是.Net 4.0或更新版本,那么你可以使用最新版本的Json.Net。

+0

@JonSkeet - 你认为有办法解决这个问题吗?我很惊讶绑定重定向在.Net 3.5中不起作用,但在4.0或4.5中可以工作。 –

+0

我不太确定我是否了解它。 NuGet是否安装了最新版本的Json.NET,尽管这不适合您尝试使用的项目。 –

+0

在.net 3.5项目中,如果你只是安装'NodaTime.Serialization.JsonNet'并且让nuget拉下依赖关系,那么它会抓取Json.net 4.5.11,并且一切正常。你可以更新所有的方式到Json.net 5.0.8,它仍然有效。但如果你只是抓住最新版本(6.0.1或更高版本),它不能编译。我不确定为什么,但我认为解决方案是构建NodaTime.Serialization。JsonNet nuget包,包含net35-Client和net40-Client版本,其中net35版本在编译时引用json.net的net35版本。 –