Jestem kodowanie biblioteki klas (o nazwie mylibrary.dll), która sama odwołuje się do niektórych bibliotek -> wykorzystuje następujące biblioteki DLL (zaczerpnięte z package.config za przegląd wersji):Nie można załadować pliku lub zespołu "Newtonsoft.Json, wersja = 6.0.0.0 w połączeniu z 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 jest opakowaniem, które eksponuje niektóre kodu zarządzanego do rozmówcy, że spodziewa kod niezarządzany (innymi słowy, gdzie spodziewane są rodzime wpisy DLL).
Jeśli przetestuję publiczny interfejs mylibrary.dll za pomocą metod testowych NUnit, nie wystąpi żaden błąd. Ale jeśli zadzwonię same metody, za pomocą tego samego interfejsu z targetapplication.exe uznaję następujące sytuacje: Metoda
- Test A: Połączenia proste JSON do pracy smyczkową (wykorzystuje Newtonsoft.JSON Library) i działa w porządku. Metoda
- Test B: Wywołuje metodę, która działa PostAsync a ponadto
var vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false);
kulisy rozmowa ReadAsAsync używa Newtonsoft.JSON deserializacji obiektu typu <T>
. Wydaje się, że ta funkcja jest ten, który generuje błąd:
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 zapewnia Microsoft.AspNet.WebApi.Client (rozciąga System.Net.Http), która z kolei zależy na Newtonsoft.JSON wersji 6.0 .x (patrz zależność NuGet dla tego pakietu). Wersja 6.0.x nie jest zainstalowana, zamiast wersji 8.0.x. Istnieje więc potrzeba assebly wiążącej przekierowania, który jest zarządzany w app.config:
<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>
Teraz nie wiem jak rozwiązać ten problem. W moim projekcie Microsoft.AspNet.WebApi.Client jest jedyną inną biblioteką, która odwołuje się do Newtonsoft.JSON (wersja 6.0.x, ta sama wersja, o której informuje błąd). Wygląda na to, że wiążące przekierowanie jest po prostu ignorowane. Ponieważ nie jest to "wyjątek File not found" Myślę, że jest w stanie zlokalizować wersję 8 biblioteki DLL, ale oczekiwano 6, prawda? Wszystkie biblioteki DLL są w tym samym katalogu co targetapplication.exe
aktualizacji z częściowego rozwiązania: Jako obejście udało mi się uniknąć rozmowy zewnętrznej Newtonsoft.Json przez System.Net.Http.Formatting. dll
//vResponseObject = await vResponse.Content.ReadAsAsync<ApiResponse<T>>().ConfigureAwait(false);
string vStr = await vResponse.Content.ReadAsStringAsync();
vResponseObject = JsonConvert.DeserializeObject<ApiResponse<T>>(vStr);
Ale to naprawdę nie ważne rozwiązanie dla dalszego developerski jeśli mam do kodu wokół połączeń jak mydll -> thirdparty.dll -> anotherthirdparty.dll
Czy przycisk PublicKeyToken dla Newtonsoft.Json w komunikacie o błędzie jest zgodny z plikiem app.config? –
Cześć, dziękuję za poradę, ale tak, publicKeyToken w komunikacie o błędzie jest taki sam jak w tagu assemblyIdentity. –
Czy wypróbowałeś wszystkie sugestie na https://stackoverflow.com/questions/3490327/assembly-binding-redirect-does-notwork? – danio