2016-02-23 42 views
5

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

+0

Czy przycisk PublicKeyToken dla Newtonsoft.Json w komunikacie o błędzie jest zgodny z plikiem app.config? –

+0

Cześć, dziękuję za poradę, ale tak, publicKeyToken w komunikacie o błędzie jest taki sam jak w tagu assemblyIdentity. –

+0

Czy wypróbowałeś wszystkie sugestie na https://stackoverflow.com/questions/3490327/assembly-binding-redirect-does-notwork? – danio

Odpowiedz

0

Zmień

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

dla

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

I sprawdzić w Zależności Newtonsoft.Json. jeśli ma żółtą ikonę, usuń ją i dodaj ręcznie. (Pamiętaj, aby dodać wersję 6.0). (Powinieneś mieć dll w folderze projektu lub innym projekcie). Jeśli to nie działa, dodaj starszą wersję przez NuGet (preferuję ręczne dodawanie ich ręcznie).

Lokalizacja biblioteki dll jest zwykle: C: \ Users \ Username \ Documents \ Visual Studio 2013 \ Projects \ ProjectFolder \ packages \ Newtonsoft.Json.6.0.8 \ lib \ net45 (lub jakakolwiek wersja .net)

+0

Witam, referencja działa, brak żółtej ikony. Wersja 6 nie jest możliwa, musi być> = 8 –

0

Właśnie rozwiązałem ten problem z Newtonsoft używając wersji 7.0.1. Wymieniłem stary wiążący w moim pliku web.config, który był dziwnie:

<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> 

Do:

<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> 

Wreszcie, należy zmienić odniesienie Newtonsoft z cokolwiek to wskazując, aby w swojej wersji Pakiet NuGet, v8. Najprawdopodobniej wskazuje się jedną z wielu bibliotek DLL Newton.Json, tzn. C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET Web Stack 5 \ Packages \ Newtonsoft.Json.6.0.3 \ lib \ net40. Nie mam pojęcia, dlaczego to robi, ale mam tylko problemy z tą biblioteką.

+0

Cześć, jak wspomniano w moim oryginalnym poście, sekcja powiązania zespołu wygląda dokładnie tak, jak twoja poprawiona. Odwołanie do Newtonsoft.Json wskazuje <ścieżka_projektów> \ packages \ Newtonsoft.Json.8.0.2 \ lib \ net45 \ Newtonsoft.Json.dll z lokalną kopią ustawioną na true. Zastanawiam się, dlaczego routing testowy działa bardzo dobrze, a aplikacja produkcyjna nie działa (ta sama maszyna i ja skopiowałem biblioteki z folderu kompilacji, gdzie nie dochodzi do awarii podczas testów, do folderu produktywnego, w którym wystąpił błąd ...). –

+0

@ stev-e, gdzie możesz go rozwiązać? Jeśli tak to jak? Dziękuję Ci. –