2014-04-22 59 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版本。 –