我編碼一個類庫(稱爲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
錯誤消息中的Newtonsoft.Json的PublicKeyToken與您的app.config中的內容匹配嗎? –
嗨,感謝您的建議,但是,錯誤消息中的publicKeyToken與assemblyIdentity標記中的一樣。 –
您是否嘗試過在https://stackoverflow.com/questions/3490327/assembly-binding-redirect-does-notwork上的所有建議? – danio