Come è possibile correggere i conflitti di versione dell'assembly con JSON.NET dopo aver aggiornato i riferimenti al pacchetto NuGet in un nuovo progetto ASP.NET MVC 5?


89

Ho creato un nuovo progetto Web ASP.NET MVC 5 in VS 2013 (aggiornamento 1), quindi ho aggiornato tutti i pacchetti NuGet. Quando creo il progetto, ricevo il seguente avviso:

avviso MSB3243: nessun modo per risolvere il conflitto tra "Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" e "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed".

Quando controllo web.config, tuttavia, vedo che è presente un reindirizzamento vincolante:

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

Che è esattamente ciò che suggerisce l'avvertimento.

Come posso correggere questo avviso?


Sì, ho fatto una ricostruzione completa. Ho anche aggiornato NuGet all'ultimo, creato una nuova soluzione e riprodotto lo stesso identico problema.
Jim Lamb

Risposte:


106

Ecco i passaggi che ho utilizzato per correggere l'avviso:

  • Scarica progetto in VS
  • Modifica il file .csproj
  • Cerca tutti i riferimenti all'assembly Newtonsoft.Json
    • Trovati due, uno per v6 e uno per v5
    • Sostituisci il riferimento a v5 con v6
  • Ricarica progetto
  • Compilare e notare l'errore di riferimento dell'assembly
  • Visualizza i riferimenti e vedi che ora ce ne sono due per Newtonsoft.Json. Rimuovi quello che non riesce a risolversi.
  • Ricostruisci - nessun avviso

12
Ho trovato due riferimenti, uno per v6 e uno per v5 ma ho eliminato (non sostituito) quello v5. Dopo di che non ho avuto problemi come "errore di riferimento di assembly" o due riferimenti a Newtonsoft.Json nell'interfaccia utente. Sto indovinando che qualcuno farcitoinstall.ps1
ta.speot.is

Grazie per la soluzione. Anch'io ho cancellato il vecchio riferimento dal file di progetto e non ho avuto problemi.
Charles Prakash Dasari

31
+1 - Mi fa davvero impazzire quando devo fare cose del genere. È per questo che esito sempre a fare clic su Aggiorna nel gestore di pacchetti nuget.
hylander0

1
Stavo riscontrando questo problema e l'ho risolto rimuovendo il riferimento extra che non avevo realizzato. Questo è il collegamento al bug di Microsoft Connect che è la causa principale del riferimento aggiuntivo presente: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello

1
Nel mio caso c'erano riferimenti a due diverse versioni di Newtonsoft.Json 11.0.1 e 11.0.2, sebbene si lamentasse della versione 6.0.
Daniel Lobo

31

Ho avuto questo problema perché ho aggiornato i pacchetti, che includevano Microsoft.AspNet.WebApi che ha un riferimento a Newtonsoft.Json 4.5.6 e avevo già installato la versione 6. Non era abbastanza intelligente usare la versione 6.

Per risolverlo, dopo l'aggiornamento WebApi ho aperto Strumenti> NuGet Package Manager> Pacakge Manager Console e ho eseguito:

 Update-Package Newtonsoft.Json

Il registro mostrava che le versioni 6.0.xe 4.5.6 erano state tutte aggiornate all'ultima e che andava tutto bene.

Ho la sensazione che questo si ripresenterà.


1
Avevo il problema di più versioni diverse nella mia soluzione che contiene più progetti, questo lo ha risolto completamente e ha aggiornato tutto all'ultimo JSON.net. Bello!
c0d3p03t

1
Questa è stata la soluzione più semplice e diretta che ha risolto il mio problema. Grazie!
youngrrrr

21

Ho scoperto di eliminare questa sezione dal file di progetto per risolvere il problema.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


Questo è. Suppongo che nessuno di Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 corrisponda al reindirizzamento vincolante '' oldVersion = "0.0.0.0-6.0.0.0" '' Ma non so come scriverne uno corretto
fantastory

Questo era anche il mio problema, non sono sicuro di cosa lo abbia aggiunto.
amnesia

Ha funzionato per me. Errore relativo al conflitto tra v6.0 e v12.0. Il riferimento del gruppo di articoli era alla v11.0. Quindi non sono sicuro di cosa stia succedendo, ma la rimozione del gruppo di elementi sembra averlo risolto, per quanto riguarda la rimozione dell'errore di compilazione.
Brian.S

13

Se nessuna delle soluzioni precedenti funziona, prova a utilizzarla in web.config o app.config:

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

Questo è più adatto per la situazione in cui si dispone di un progetto esistente che utilizza la versione superiore e si aggiunge una dipendenza che utilizza una versione precedente dello stesso pacchetto, in modo da reindirizzare la vecchia versione a quella nuova.
Ismail Hawayel,

13

Ho aggiornato da Newtonsoft.Json 11.0.1 a 12.0.2. Aprendo il file di progetto in Notepad ++ ho scoperto entrambi

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

e

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

Ho eliminato ItemGroup racchiudendo il riferimento con il percorso del suggerimento alla versione 11.0.1.

Questi problemi possono essere follemente frustranti da trovare. Inoltre, gli sviluppatori seguono spesso gli stessi passaggi delle precedenti configurazioni del progetto. Le configurazioni precedenti non hanno riscontrato il problema. Per qualsiasi motivo il file di progetto viene occasionalmente aggiornato in modo errato.

Desidero disperatamente che Microsoft risolva questi problemi di inferno della DLL di Visual Studio. Succede fin troppo spesso e il progresso si ferma fino a quando non viene risolto, spesso per tentativi ed errori.


1
Questo era esattamente il problema. Grazie!
George Fabish,

8

La soluzione finale agli errori di reindirizzamento dell'assembly

Va bene, si spera che questo dovrebbe aiutare a risolvere eventuali discrepanze di riferimento di assembly (sensate) ...

  1. Controlla l'errore.

Naviga sul sito web

  1. Controllare web.config dopo il reindirizzamento dell'assembly. Creane uno se non esiste.

Reindirizzamento dell'assembly web.config esistente

  1. Fare clic con il pulsante destro del mouse sul riferimento per l'assieme e scegliere Proprietà.

Assemblaggio nella Lista di riferimento, nel relativo progetto

  1. Controllare la versione (non la versione runtime) nella tabella delle proprietà. Copia questo.

Tabella delle proprietà che mostra la versione dell'assieme

  1. Incolla nell'attributo newVersion.

reindirizzamento dell'assembly web.config con newVersion aggiornato

  1. Per comodità, cambia l'ultima parte della vecchia versione in qualcosa di alto, rotondo e immaginario.

reindirizzamento dell'assembly web.config con oldVersion aggiornata

Rallegrarsi.


Questa risposta mi ha fatto risparmiare molto tempo! Avevo un'applicazione Web che utilizzava una libreria C # personalizzata, entrambe utilizzavano lo stesso pacchetto nuget ma l'applicazione Web ha una versione precedente rispetto alla libreria e il reindirizzamento non includeva la versione utilizzata dalla libreria.
War Gravy

4

Ricordalo con il reindirizzamento vincolante

oldVersion = "0.0.0.0-6.0.0.0"

Stai dicendo che le vecchie versioni della dll sono comprese tra la versione 0.0.0.0 e la versione 6.0.0.0.


1
oldVersionè un po 'improprio qui in realtà, quello che stai dicendo è che il tuo assembly / exe è stato costruito con un riferimento a una versione nell'intervallo 0.0.0.0-6.0.0.0e che la versione effettivamente installata (e preferita) è il valore sotto newVersion(la vecchia versione sarebbe meglio formulata come "versione prevista" e la nuova versione sarebbero meglio formulate come "versione disponibile effettiva")
niente è necessario

2

Nessuno ha menzionato quanto segue, che a mio avviso è la soluzione corretta:

Vai alla csproj del progetto in cui è installato il NuGet, e impostare l' AutoGEneratedBindingRedirectsa false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Articolo completo su MSDN.


1

Ho aggiornato il mio pacchetto e l'ho persino reinstallato, ma ricevevo ancora lo stesso identico errore dell'OP menzionato. Ho modificato manualmente la DLL a cui si fa riferimento effettuando le seguenti operazioni.

Ho rimosso newtonsoft.json.dll dal mio riferimento, quindi ho eliminato manualmente il .dll dalla directory bin. Quindi ho copiato manualmente newtonsoft.json.dll dalla cartella del pacchetto nuget nel cestino del progetto, quindi ho aggiunto il riferimento sfogliando il file .dll.

Ora il mio progetto ricostruisce.


0

Ho avuto un problema simile e volevo solo pubblicare una risposta per gli altri nella mia situazione.

Ho una soluzione che esegue un'applicazione Web ASP.NET con più altri progetti lib di classe C #.

La mia applicazione Web ASP.NET non utilizzava json, ma altri progetti dove.

Ecco come l'ho risolto:

  1. Mi sono assicurato che tutti i progetti usassero l'ultima versione (6) usando NuGet Update su tutti i progetti che attualmente utilizzano qualsiasi versione di json - questo non ha risolto il problema
  2. Ho aggiunto json all'applicazione Web utilizzando NuGet: questo ha risolto il problema (fammi capire perché):

Il passaggio 2 è stato innanzitutto l'aggiunta di informazioni di configurazione per json, che suggeriscono che tutti i progetti utilizzino l'ultima versione (6) indipendentemente dalla versione che hanno. L'aggiunta dell'associazione dell'assembly a Web.Config è molto probabilmente la correzione.

Tuttavia, il passaggio 2 ha anche ripulito un codice legacy. Si è scoperto che in precedenza abbiamo utilizzato una vecchia versione (5) di json nella nostra applicazione Web e le cartelle NuGet non sono state eliminate quando il riferimento è stato (sospetto: manualmente) rimosso. Aggiungendo l'ultimo json (6), rimosse le vecchie cartelle (json v5). Anche questo potrebbe essere parte della correzione.


0

Veverke ha affermato che è possibile disabilitare la generazione di reindirizzamenti vincolanti impostando AutoGEneratedBindingRedirects su false. Non sono sicuro che si tratti di una novità da quando questa domanda è stata pubblicata, ma c'è un'opzione "Salta l'applicazione dei reindirizzamenti vincolanti" in Strumenti / Opzioni / Nuget Packet Manager, che può essere attivata. Per impostazione predefinita è disattivato, il che significa che verranno applicati i reindirizzamenti. Tuttavia, se lo fai, dovrai gestire manualmente tutti i reindirizzamenti vincolanti necessari.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.