2016-02-23 61 views
5

我編碼一個類庫(稱爲mylibrary.dll)本身引用一些圖書館 - >使用下列DLL(從package.config採取版本概述):無法加載文件或程序集「Newtonsoft.Json,結合版本= 6.0.0.0與Microsoft.AspNet.WebApi.Client

<package id="EntityFramework" version="6.0.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" /> 
    <package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" /> 
    <package id="System.Data.SQLite" version="1.0.99.0" targetFramework="net45" /> 
    <package id="System.Data.SQLite.Core" version="1.0.99.0" targetFramework="net45" /> 
    <package id="System.Data.SQLite.EF6" version="1.0.99.0" targetFramework="net45" /> 
    <package id="System.Data.SQLite.Linq" version="1.0.99.0" targetFramework="net45" /> 
    <package id="UnmanagedExports" version="1.2.7" targetFramework="net45" />` 

mylibrary.dll是暴露了一些託管代碼給需要非託管代碼(在本機DLL項目預計換句話說呼叫者的包裝)。

如果我測試通過NUnit測試方法mylibrary.dll的公共接口沒有錯誤可言。但是,如果我通過打電話從我認識下列情況下targetapplication.exe相同的接口相同的方法:

  • 試驗方法A:調用一個簡單的JSON字符串操作(利用 Newtonsoft.JSON庫)並運行正好。
  • 試驗方法B:調用一個方法 ,做一個PostAsync並且此外

var vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false);

的ReadAsAsync呼叫使用Newtonsoft.JSON反序列化<T>類型的對象在幕後。看來,這個功能是生成錯誤之一:

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

HTTPContent.ReadAsAsync由Microsoft.AspNet.WebApi.Client(擴展System.Net.Http),其本身取決於Newtonsoft.JSON 6.0版提供.x(請參閱此包的NuGet依賴關係)。版本6.0.x未安裝,而是版本8.0.x.因此,有必要對於在app.config中管理assebly綁定重定向:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
<dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" /> 
</dependentAssembly> 
</assemblyBinding> 

現在我不知道如何解決這個問題。在我的項目Microsoft.AspNet.WebApi.Client是引用Newtonsoft.JSON其他圖書館中唯一一個(版本對6.0.x,相同版本的錯誤告訴我)。似乎綁定重定向簡單地被忽略。因爲它不是「文件未找到異常」我認爲它能夠找到版本8的DLL但預計6,對不對?所有的DLL都在同一個目錄中targetapplication.exe

更新有部分解決方案: 作爲一種變通方法,我能夠避免通過System.Net.Http.Formatting Newtonsoft.Json的外部調用。 dll的

//vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false); 
string vStr = await vResponse.Content.ReadAsStringAsync(); 
vResponseObject = JsonConvert.DeserializeObject<ApiResponse<T>>(vStr); 

但是,這真的是進一步研究與開發沒有有效的解決辦法,如果我要周圍像MYDLL一個調用的代碼 - > thirdparty.dll - > anotherthirdparty.dll

+0

錯誤消息中的Newtonsoft.Json的PublicKeyToken與您的app.config中的內容匹配嗎? –

+0

嗨,感謝您的建議,但是,錯誤消息中的publicKeyToken與assemblyIdentity標記中的一樣。 –

+0

您是否嘗試過在https://stackoverflow.com/questions/3490327/assembly-binding-redirect-does-notwork上的所有建議? – danio

回答

0

變化

<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" /> 

<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 

併爲您在您的依賴Newtonsoft.Json。如果它有黃色圖標,請將其刪除並手動添加。 (確保添加6.0版本)。 (你應該有你的項目文件夾,或其他項目的DLL)。如果這不起作用通過NuGet添加舊版本(我preffer自己手動添加它們)。

dll的位置通常是:C:\ Users \ Username \ Documents \ Visual Studio 2013 \ Projects \ ProjectFolder \ packages \ Newtonsoft.Json.6.0.8 \ lib \ net45(或任何版本的.net)

+0

嗨,參考工作,沒有黃色的圖標。版本6是不可能的,它需要是> = 8 –

0

我剛剛用Newtonsoft使用7.0.1版解決了這個問題。我取代舊的綁定在我的web.config文件,這是奇怪的:

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

要:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> 
     <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

最後,改變從不管它是指向Newtonsoft參考,給你的版本NuGet包,第8版。您很可能會指向許多Newton.Json DLL之一,即C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET Web Stack 5 \ Packages \ Newtonsoft.Json.6.0.3 \ lib \ net40。我不知道爲什麼這樣做,但我只有這個庫的問題。

+0

嗨,正如我原來的文章中提到的,程序集綁定部分看起來完全像你的改進。 Newtonsoft.Json的引用指向本地拷貝設置爲true的 \ packages \ Newtonsoft.Json.8.0.2 \ lib \ net45 \ Newtonsoft.Json.dll。我想知道爲什麼測試路由工作得很好,並且生產性應用程序失敗(同一臺機器和我從build文件夾複製庫,在測試過程中沒有發生故障,發生錯誤的生產文件夾......)。 –

+0

@ stev-e你能解決這個問題嗎?如果是這樣,怎麼樣?謝謝。 –

相關問題