2016-02-23 25 views
5

Sto codificando una libreria di classi (denominata mylibrary.dll) che a sua volta fa riferimento ad altre librerie -> utilizza le seguenti DLL (tratto da package.config per una panoramica versione):Impossibile caricare il file o l'assembly 'Newtonsoft.Json, versione = 6.0.0.0 in combinazione con 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 è un wrapper che espone alcuni codice gestito per un chiamante che si aspetta che il codice non gestito (in altre parole, in cui si prevede voci DLL native).

Se si verifica l'interfaccia pubblica di mylibrary.dll tramite i metodi di test NUnit, non vi è alcun errore. Ma se chiamo stessi metodi tramite la stessa interfaccia dal targetapplication.exe riconosco le seguenti situazioni: metodo

  • prova A: Chiama una semplice JSON al funzionamento stringa (fa uso di libreria Newtonsoft.JSON) e viene eseguito va bene. Metodo
  • prova B: chiama un metodo che fa un PostAsync e, inoltre,

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

Dietro le quinte la chiamata ReadAsAsync utilizza Newtonsoft.JSON per deserializzare l'oggetto di tipo <T>. Sembra che questa funzione è quella che genera l'errore:

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 è fornito da Microsoft.AspNet.WebApi.Client (estende System.Net.Http) che si dipende Newtonsoft.JSON versione 6.0 .x (vedi la dipendenza NuGet per questo pacchetto). La versione 6.0.x non è installata, invece la versione 8.0.x. Quindi v'è la necessità per il reindirizzamento assebly vincolante che è gestito in 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> 

Ora non so come risolvere questo. Nel mio progetto Microsoft.AspNet.WebApi.Client è l'unica delle altre librerie che fa riferimento a Newtonsoft.JSON (versione 6.0.x, la stessa versione che l'errore mi dice). Sembra che il reindirizzamento vincolante sia semplicemente ignorato. Perché non è "File non trovato eccezione" Penso che sia in grado di individuare la versione 8 della dll, ma si aspettava 6, giusto? Tutte le DLL sono nella stessa directory del targetapplication.exe

Aggiornamento con una soluzione parziale: Per aggirare il problema sono stato in grado di evitare la chiamata esterna di Newtonsoft.Json attraverso 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); 

ma questo è davvero nessuna soluzione valida per l'ulteriore sviluppo se devo codificare circa un chiamate come mydll -> thirdparty.dll -> anotherthirdparty.dll

+0

Il PublicKeyToken per Newtonsoft.Json nel messaggio di errore corrisponde a ciò che è contenuto in app.config? –

+0

Ciao, grazie per il consiglio ma sì, publicKeyToken nel messaggio di errore è lo stesso del tag assemblyIdentity. –

+0

Hai provato tutti i suggerimenti su https://stackoverflow.com/questions/3490327/assembly-binding-redirect-does-not-work? – danio

risposta

0

Change

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

per

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

E controllare nel vostro dipendenze Newtonsoft.Json. se ha l'icona gialla, cancellala e aggiungila manualmente. (Assicurati di aggiungere la versione 6.0). (Dovresti avere la DLL nella cartella del tuo progetto, o qualche altro progetto). Se non funziona, aggiungi la vecchia versione tramite NuGet (preferisco aggiungerli manualmente).

La posizione della DLL è in genere: C: \ Utenti \ Nomeutente \ Documenti \ Visual Studio 2013 \ Progetti \ ProjectFolder \ packages \ Newtonsoft.Json.6.0.8 \ lib \ net45 (o qualsiasi versione di .net)

+0

Ciao, il riferimento funziona, nessuna icona gialla lì. La versione 6 non è possibile, deve essere> = 8 –

0

Ho appena risolto questo problema con Newtonsoft utilizzando la versione 7.0.1. Ho sostituito il vecchio legame nel mio file web.config, che era stranamente:

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

A:

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

Infine, modificare il riferimento Newtonsoft da tutto ciò che sta indicando, per la versione nella vostra Pacchetto NuGet, v8. Probabilmente stai puntando a una delle tante DLL di Newton.Json, ad esempio C: \ Programmi (x86) \ Microsoft ASP.NET \ ASP.NET Stack di Web 5 \ Packages \ Newtonsoft.Json.6.0.3 \ lib \ net40. Non ho idea del motivo per cui lo fa, ma ho avuto solo problemi con questa libreria.

+0

Ciao, come accennato nel mio post originale, la sezione di assemblaggio dell'assemblaggio sembra esattamente come quella migliorata. E il riferimento di Newtonsoft.Json punta a \ packages \ Newtonsoft.Json.8.0.2 \ lib \ net45 \ Newtonsoft.Json.dll con copia locale impostata su true. Mi chiedo perché il routing di test funzioni molto bene e l'applicazione produttiva fallisca (stessa macchina e ho copiato le librerie dalla cartella di build, dove non si verifica nessun errore durante i test, alla cartella produttiva, dove si verifica l'errore ...). –

+0

@ stev-e dove è in grado di risolverlo? se é cosi, come? grazie. –