Avvertimento:Rilevati conflitti tra diverse versioni dello stesso assembly dipendente

StackOverflow https://stackoverflow.com/questions/17806

  •  09-06-2019
  •  | 
  •  

Domanda

Attualmente sto sviluppando un'applicazione .NET, composta da 20 progetti.Alcuni di questi progetti sono compilati utilizzando .NET 3.5, altri sono ancora progetti .NET 2.0 (finora nessun problema).

Il problema è che se includo un componente esterno ricevo sempre il seguente avviso:

"Found conflicts between different versions of the same dependent assembly".

Cosa significa esattamente questo avviso ed esiste forse la possibilità di escluderlo (come utilizzare #pragma Disable nei file del codice sorgente)?

È stato utile?

Soluzione

Questo avviso significa che due progetti fanno riferimento allo stesso assembly (ad es. System.Windows.Forms) ma i due progetti richiedono versioni diverse.Hai alcune opzioni:

  1. Ricompilare tutti i progetti per utilizzare le stesse versioni (ad es.sposta tutto su .Net 3.5).Questa è l'opzione preferita perché tutto il codice viene eseguito con le versioni delle dipendenze con cui è stato compilato.

  2. Aggiungere un reindirizzamento vincolante.Ciò sopprimerà l'avviso.Tuttavia, i tuoi progetti .Net 2.0 saranno (in fase di runtime) associati alle versioni .Net 3.5 degli assembly dipendenti come System.Windows.Forms.È possibile aggiungere rapidamente un reindirizzamento di associazione facendo doppio clic sull'errore in Visual Studio.

  3. Utilizzo CopyLocal=true.Non sono sicuro che questo eliminerà l'avviso.Come l'opzione 2 sopra, significherà che tutti i progetti utilizzeranno la versione .Net 3.5 di System.Windows.Forms.

Ecco un paio di modi per identificare i riferimenti offensivi:

  • È possibile utilizzare un'utilità come quella trovata inhttps://gist.github.com/1553265
  • Un altro metodo semplice è quello di impostare la verbosità di build output (strumenti, opzioni, progetti e soluzioni, build ed esegui, MSBuild Project Build Output Verbosity, dettagliato) e dopo la costruzione, cerca la finestra di output per l'avvertimento e guarda il testo appena sopra di esso . (Punta di cappello a pauloya Chi lo ha suggerito nei commenti su questa risposta).

Altri suggerimenti

Fondamentalmente questo accade quando gli assembly a cui fai riferimento hanno "Copia locale" impostato su "Vero", il che significa che una copia della DLL viene inserita nella cartella bin insieme al tuo exe.

Poiché Visual Studio copierà anche tutte le dipendenze di un assembly di riferimento, è possibile che si faccia riferimento a due build diverse dello stesso assembly.Ciò è più probabile che accada se i tuoi progetti si trovano in soluzioni separate e possono quindi essere compilati separatamente.

Il modo in cui ho risolto il problema è impostare Copy Local su False per i riferimenti nei progetti di assembly.Fallo solo per file eseguibili/applicazioni web in cui è necessario l'assembly per l'esecuzione del prodotto finito.

Spero che abbia senso!

Volevo pubblicare la soluzione di Pauloya fornita nei commenti sopra.Credo che sia la soluzione migliore per trovare i riferimenti incriminati.

Il modo più semplice per trovare quali sono i "riferimenti offensivi" è impostare la verbosità di output di build (strumenti, opzioni, progetti e soluzioni, build ed esegui, MSBuild Project Build Output Verbosità, dettagliata) e dopo la costruzione, cerca la finestra di uscita per l'avvertimento.Guarda il testo appena sopra di esso.

Ad esempio, quando cerchi "conflitto" nel pannello di output potresti trovare qualcosa di simile a questo:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

Come puoi vedere, esiste un conflitto tra le versioni 5 e 6 di EF.

Ho avuto lo stesso problema con uno dei miei progetti, tuttavia, nessuno dei suggerimenti precedenti ha aiutato a risolvere l'avviso.Ho controllato il file di registro dettagliato della build, ho usato AsmSpy per verificare di aver utilizzato le versioni corrette per ciascun progetto nella soluzione interessata, ho ricontrollato le voci effettive in ciascun file di progetto: niente ha aiutato.

Alla fine si è scoperto che il problema era una dipendenza annidata di uno dei riferimenti che avevo in un progetto.Questo riferimento (A) a sua volta richiedeva una versione diversa di (B) a cui si faceva riferimento direttamente da tutti gli altri progetti nella mia soluzione.L'aggiornamento del riferimento nel progetto di riferimento lo ha risolto.

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

Spero che quanto sopra mostri cosa intendo, ci ho messo un paio d'ore per scoprirlo, quindi spero che anche qualcun altro ne trarrà beneficio.

Su Visual Studio se fai clic con il pulsante destro del mouse su soluzione E Gestire i pacchetti Nuget c'è un "Consolidare" scheda che imposta tutti i pacchetti sulla stessa versione.

Ho appena ricevuto questo messaggio di avviso, ho pulito la soluzione e l'ho ricompilata (Build -> Clean Solution) ed è andato via.

Ho avuto lo stesso problema e l'ho risolto modificando quanto segue in web.config.

Mi è successo perché sto eseguendo l'applicazione utilizzando Newtonsoft.Json 4.0

Da:

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

A:

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

Questo in realtà dipende dal componente esterno.Quando si fa riferimento a un componente esterno in un'applicazione .NET, viene generato un GUID per identificare quel componente.Questo errore si verifica quando il componente esterno a cui fa riferimento uno dei tuoi progetti ha lo stesso nome ma una versione diversa di un altro componente simile in un altro assembly.

Questo a volte accade quando usi "Sfoglia" per trovare riferimenti e aggiungi la versione sbagliata dell'assembly oppure hai una versione diversa del componente nel tuo repository di codice rispetto a quella installata nel computer locale.

Prova a trovare quali progetti presentano questi conflitti, rimuovi i componenti dall'elenco di riferimenti, quindi aggiungili di nuovo assicurandoti di puntare allo stesso file.

Ho un altro modo per farlo se usi Nuget per gestire le tue dipendenze.Ho scoperto che a volte VS e Nuget non corrispondono e Nuget non è in grado di riconoscere che i tuoi progetti non sono sincronizzati.Il file packages.config dirà una cosa ma il percorso mostrato in Riferimenti - Proprietà indicherà qualcos'altro.

Se sei disposto ad aggiornare le tue dipendenze, procedi come segue:

  1. Da Solution Explorer, fai clic con il pulsante destro del mouse sul progetto e fai clic su "Gestisci pacchetti Nuget"

  2. Seleziona la scheda "Pacchetti installati" nel riquadro di sinistra Registra i pacchetti installati che potresti voler copiare i pacchetti. Config prima sul desktop se hai molto, in modo da poterlo controllare con Google per vedere cosa sono installati Nuget PKGS

  3. Disinstalla i tuoi pacchetti.Va bene, li aggiungeremo subito.

  4. Installa immediatamente i pacchetti che ti servono.Ciò che Nuget farà non solo ti fornirà la versione più recente, ma modificherà i tuoi riferimenti e aggiungerà anche i reindirizzamenti vincolanti per te.

  5. Fallo per tutti i tuoi progetti.

  6. A livello di soluzione, esegui Pulisci e ricostruisci.

Potresti voler iniziare con i progetti inferiori e procedere fino a quelli di livello superiore e ricostruire ogni progetto man mano che procedi.

Se non desideri aggiornare le tue dipendenze, puoi utilizzare la console del gestore pacchetti e utilizzare la sintassi Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

=> controlla che ci siano alcune istanze dell'applicazione installate parzialmente.

=> prima di tutto disinstalla quell'istanza dall'applicazione di disinstallazione.

=> quindi, pulisci, ricostruisci e prova a eseguire la distribuzione.

questo ha risolto il mio problema. Spero che aiuti anche te.Distinti saluti.

Si presentava anche questo problema: nel mio caso era causato dal fatto che la proprietà "Versione specifica" su un numero di riferimenti era impostata su true.La modifica in false su tali riferimenti ha risolto il problema.

Anche questo è successo a me.È stato fatto riferimento a una dll due volte:una volta direttamente (nei riferimenti) e una volta indirettamente (fa riferimento a un altro progetto referenziato).Ho rimosso il riferimento diretto, pulito e ricostruito la soluzione.Problema risolto.

  1. Apri "Esplora soluzioni".
  2. Fare clic su "Mostra tutti i file"
  3. Espandi "Riferimenti"
  4. Vedrai uno (o più) riferimenti con un'icona leggermente diversa rispetto agli altri.Solitamente è contrassegnato da un riquadro giallo che suggerisce di prenderne nota.Basta rimuoverlo.
  5. Aggiungi il riferimento e compila il tuo codice.
  6. È tutto.

Nel mio caso, si è verificato un problema con il riferimento MySQL.In qualche modo, potrei elencarne tre versioni nell'elenco di tutti i riferimenti disponibili;per .net 2.0, .net 4.0 e .net 4.5.Ho seguito i processi da 1 a 6 sopra e ha funzionato per me.

Un'altra cosa da considerare e controllare è assicurarsi di non avere alcun servizio in esecuzione che utilizzi quella cartella bin.in tal caso, interrompere il servizio e ricostruire la soluzione

Sembra che ci sia un problema su Mac Visual Studio durante la modifica dei file .resx.Non so davvero cosa sia successo, ma ho riscontrato questo problema non appena ho modificato alcuni file .resx sul mio Mac.Ho aperto il progetto su Windows, ho aperto i file ed erano come se non fossero stati modificati.Quindi li ho modificati, salvati e tutto ha ripreso a funzionare anche su Mac.

Ho riscontrato questo problema quando il mio progetto faceva riferimento a NETStandardLibrary e uno degli assembly a cui si fa riferimento è stato pubblicato per netcore.L'ho appena pubblicato come netstandard e il problema è scomparso

Se utilizzavo NuGet tutto quello che dovevo fare era:

  1. fare clic con il pulsante destro del mouse su progetto e fare clic su Gestisci pacchetti NuGet.

  2. clicca sull'ingranaggio in alto a destra

  3. fare clic sulla scheda Generale in Gestione pacchetti NuGet sopra Origini pacchetto

  4. seleziona "Salta l'applicazione dei reindirizzamenti di associazione" in Reindirizzamenti di associazione

  5. Pulisci e ricostruisci e l'avvertimento sparirà

Vai tranquillo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top