Avertisment: S-au găsit conflicte între versiuni diferite ale aceluiași ansamblu dependent (Programare, .Net, Avertismente)

ollifant a intrebat.

În prezent, dezvolt o aplicație .NET, care constă din 20 de proiecte. Unele dintre aceste proiecte sunt compilate folosind .NET 3.5, altele sunt încă proiecte .NET 2.0 (până acum nicio problemă).

Problema este că, dacă includ o componentă externă, primesc întotdeauna următorul avertisment:

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

Ce înseamnă mai exact acest avertisment și dacă există vreo posibilitate de a exclude acest avertisment (cum ar fi utilizarea #pragma disable în fișierele de cod sursă)?

Comentarii

  • Posibil duplicat al articolului Rezolvarea MSB3247 – A găsit conflicte între diferite versiuni ale aceluiași ansamblu dependent –  > Por Michael Freidgeim.
19 răspunsuri
Brian Low

Acest avertisment înseamnă că două proiecte fac referire la același ansamblu (de ex. System.Windows.Forms), dar cele două proiecte necesită versiuni diferite. Aveți câteva opțiuni:

  1. Recompilați toate proiectele pentru a utiliza aceleași versiuni (de exemplu, mutați-le pe toate la .Net 3.5). Aceasta este opțiunea preferată, deoarece tot codul rulează cu versiunile de dependențe cu care au fost compilate.

  2. Adăugați o redirecționare a legăturii. Acest lucru va suprima avertismentul. Cu toate acestea, proiectele dvs. .Net 2.0 vor fi legate (în timpul execuției) de versiunile .Net 3.5 ale ansamblurilor dependente, cum ar fi System.Windows.Forms. Puteți adăuga rapid o redirecționare de legare făcând dublu clic pe eroare în Visual Studio.

  3. Utilizați CopyLocal=true. Nu sunt sigur dacă acest lucru va suprima avertismentul. La fel ca opțiunea 2 de mai sus, va însemna că toate proiectele vor utiliza versiunea .Net 3.5 a System.Windows.Forms.

Iată câteva modalități de a identifica referința (referințele) incriminată (incriminate):

  • Puteți utiliza un utilitar, cum ar fi cel care se găsește la adresahttps://gist.github.com/1553265
  • O altă metodă simplă este să setați Verbositatea de ieșire a proiectului Buildoutput (Tools, Options, Projects and Solutions, Build andRun, MSBuild project build output verbosity, Detailed) și, după construire, să căutați în fereastra de ieșire avertismentul și să vă uitați la textul de deasupra acestuia. (Hat tip pentru pauloya care a sugerat acest lucru în comentariile la acest răspuns).

Comentarii

  • Doar pentru o modalitate rapidă de a-l găsi fără utilitar – dacă adăugați redirecționarea de legare (ca opțiunea 2), se va arăta acolo referința (referințele) implicată (implicate) – dacă doriți, puteți folosi apoi una dintre celelalte metode pentru a o gestiona și puteți șterge redirecționarea (redirecționările) de legare din fișierul de configurare. –  > Por Brisbe.
  • 234

  • Cel mai simplu mod de a găsi care sunt „referința (referințele) incriminată (incriminate)” este să setați Build output verbosity (Tools, Options, Projects and Solutions, Build and Run, MSBuild project build output verbosity, Detailed) și, după construire, să căutați în fereastra de ieșire avertismentul. Consultați textul de deasupra acestuia. –  > Por pauloya.
  • Redirecționarea obligatorie prin dublu clic pe avertisment (pasul 2) nu-mi elimină avertismentul. Văd app.config adăugat cu ansamblul pe care bănuiesc că este cauza, dar avertismentul este încă acolo după o curățare/reconstrucție. De asemenea, am încercat pasul 3 în plus, fără noroc. Aveți vreo idee? –  > Por angularsen.
  • Dar dacă nu sunt referințe din propriile proiecte? De exemplu, am făcut referire la un proiect, care are dependență de Newtonsoft.Json, Version=6.0.0.0.0, și am făcut referire la un alt proiect, care are dependență de Newtonsoft.Json, Version=4.5.0.0.0 –  > Por Edward Ned Harvey.
  • @brian-low, pot să vă sugerez să adăugați setarea Build output verbosity (așa cum a fost sugerat în comentariul lui @pauloya) ca opțiune în răspunsul dvs. alături de utilitarul legat? (Disclaimer, am încercat de fapt să editez răspunsul pentru a face exact acest lucru, dar a fost respins la revizuire :))) –  > Por Rick Riensche.
Matt Hamilton

Practic, acest lucru se întâmplă atunci când ansamblurile la care faceți referire au „Copy Local” setat la „True”, ceea ce înseamnă că o copie a DLL este plasată în folderul bin împreună cu exe-ul dvs.

Deoarece Visual Studio va copia și toate dependențele unui ansamblu la care se face referire, este posibil să se ajungă la două ediții diferite ale aceluiași ansamblu la care se face referire. Acest lucru este mai probabil să se întâmple dacă proiectele dvs. sunt în soluții separate și, prin urmare, pot fi compilate separat.

Modul în care am reușit să ocolesc această problemă este să setez Copy Local la False pentru referințele din proiectele de asamblare. Faceți acest lucru numai pentru executabile/aplicații web în cazul în care aveți nevoie de ansamblul pentru ca produsul finit să funcționeze.

Sper că are sens!

user1477388

Am vrut să postez soluția lui pauloya pe care au furnizat-o în comentariile de mai sus. Cred că este cea mai bună soluție pentru a găsi referințele incriminate.

Cel mai simplu mod de a găsi care sunt „referințele incriminate” este să setați Verbozitatea de ieșire a construcției (Tools, Options, Projects and Solutions, Build and Run, MSBuild project build output verbosity, Detailed) și, după construcție, căutați în fereastra de ieșire pentru avertisment. Consultați textul de deasupra acestuia.

De exemplu, atunci când căutați „conflict” în panoul de ieșire, puteți găsi ceva de genul acesta:

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.

După cum puteți vedea, există un conflict între versiunile EF 5 și 6.

Comentarii

  • Dar acum că am aceste informații, cum pot elimina eroarea? Pot să văd care este conflictul, dar nu pot găsi locul în care proiectul face referire la versiunea conflictuală…  > Por Bassie.
  • Bună @Bassie, primul lucru pe care trebuie să-l faceți ar fi să verificați fișierul pachetului nuget și să stabiliți dacă trebuie să actualizați toate fișierele la aceeași versiune a pachetului. Puteți face acest lucru executând o comandă similară cu update-package [your package name] -version 6.0.0 -reinstall conform răspunsului meu de aici stackoverflow.com/questions/22685530/… –  > Por user1477388.
  • @Bassie, puteți face ceea ce sugerează avertismentul și adăugați redirecționarea obligatorie în fișierul app.config! (dacă actualizarea nu este o opțiune, asta este.) – –  > Por BrainSlugs83.
  • @Bassie vezi răspunsul meu, unde îți arăt cum să obții diferite ansambluri/.dll-uri care cauzează probleme de neconcordanță. –  > Por newprint.
Gorgsenegger

Am avut aceeași problemă cu unul dintre proiectele mele, totuși, niciuna dintre cele de mai sus nu a ajutat la rezolvarea avertismentului. Am verificat fișierul jurnal de construcție detaliat, am folosit AsmSpy pentru a verifica dacă am folosit versiunile corecte pentru fiecare proiect din soluția afectată, am verificat de două ori intrările reale din fiecare fișier de proiect – nimic nu a ajutat.

În cele din urmă, s-a dovedit că problema era o dependență imbricata a uneia dintre referințele pe care le aveam într-un proiect. Această referință (A), la rândul ei, necesita o versiune diferită de (B) care era menționată direct din toate celelalte proiecte din soluția mea. Actualizarea referinței în proiectul la care se făcea referire a rezolvat problema.

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)

Sper că cele de mai sus arată ce vreau să spun, mi-a luat câteva ore să aflu, așa că sper că va beneficia și altcineva.

Comentarii

  • Aceeași problemă aici. Cu toate acestea, nu am nicio șansă să actualizez referința la o versiune mai nouă. Am încercat să folosesc un App.config: deși funcționează pentru aplicație, Visual Studio 2010 pare să o ignore în timpul compilării. –  > Por Thomas Weller.
  • wow, am avut aceste probleme timp de două luni și nu am putut să le localizez și să le rezolv. Din anumite motive, se bloca doar în timpul depanării și, în unele cazuri, înlocuia manual dll-ul deranjant cu cel real din folderul bin atunci când se întâmpla acest lucru. Depanarea era o adevărată pacoste. Când am citit răspunsul tău mi-am dat seama că exact asta mi se întâmpla și am rezolvat problema în 5 minute 🙂 –  > Por Dennis Puzak.
Tiago Gouvêa

În Visual Studio dacă faceți clic dreapta pe soluție și Gestionați pachetele nuget există un „Consolidare” care stabilește toate pachetele la aceeași versiune.

MoMo

Tocmai am avut acest mesaj de avertizare și am curățat soluția și am recompilat-o (Build -> Clean Solution) și a dispărut.

Comentarii

  • Numai până când reconstruiți soluția, totuși –  > Por Luke.
  • Acest lucru mă salvează! Am încercat alte soluții încă de ieri, dar aceasta mi-a rezolvat problema. Inclusiv comentariul de mai sus de acesta^. Mulțumesc! –  > Por vnpnlz.
Phil50

Am avut aceeași problemă și am rezolvat-o schimbând următoarele în web.config.

Mi s-a întâmplat pentru că execut aplicația folosind Newtonsoft.Json 4.0

De la:

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

To:

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

Comentarii

  • Aceasta a fost soluția pentru mine. Am avut o redirecționare obligatorie către versiunea superioară și a funcționat doar după ce am trecut la versiunea inferioară. –  > Por mrwaim.
  • de ce? Atât de ciudat pentru mine. Nu folosesc EF, dar am crezut că întotdeauna vrem să ne mutăm la ultima versiune? –  > Por Hoàng Long.
  • @HoàngLong pentru că versiunea la care faceți referire este cea mai veche, dar versiunea pe care o includeți este cea mai nouă. –  > Por BrainSlugs83.
Bill

Am o altă modalitate de a face acest lucru dacă folosiți Nuget pentru a gestiona dependențele. Am descoperit că, uneori, VS și Nuget nu se potrivesc, iar Nuget nu este capabil să recunoască faptul că proiectele tale nu sunt sincronizate. În packages.config se va spune un lucru, dar calea afișată în References – Properties va indica altceva.

Dacă sunteți dispus să vă actualizați dependențele, procedați după cum urmează:

  1. Din Solution Explorer, faceți clic dreapta pe proiect și faceți clic pe „ManageNuget Packages” (Gestionați pachetele Nuget).

  2. Selectați fila ‘Installed packages’ (Pachete instalate) în panoul din stânga Înregistrați pachetele instalate Este posibil să doriți să copiați mai întâi packages.config pe desktop dacă aveți multe, astfel încât să puteți face o verificare încrucișată cu Google pentru a vedea ce pachete Nuget sunt instalate

  3. Dezinstalați-vă pachetele. Este în regulă, le vom adăuga imediat înapoi.

  4. Instalați imediat pachetele de care aveți nevoie. Ceea ce va face Nuget nu este doar să vă aducă cea mai recentă versiune, ci va modifica referințele și va adăuga și redirecționările obligatorii pentru dumneavoastră.

  5. Faceți acest lucru pentru toate proiectele dumneavoastră.

  6. La nivelul soluției, efectuați un Clean and Rebuild.

Este posibil să doriți să începeți cu proiectele de nivel inferior și să ajungeți la cele de nivel superior și să reconstruiți fiecare proiect pe măsură ce avansați.

Dacă nu doriți să vă actualizați dependențele, atunci puteți utiliza consola managerului de pachete și puteți folosi sintaxa Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

Jon Limjap

Indicele a fost în afara intervalului. Trebuie să fie nenegativ și mai mic decât dimensiunea parametrului de colecție name:index.

user2566013

Încerc să adaug date ca un rând pe rând într-un datagridview iată codul meu și spune:

„Index was out of range. Trebuie să fie non-negativ și mai mic decât dimensiunea parametrului de colecție nume:index”

Ce înseamnă acest lucru? Care este problema în codul meu?

Doar un simplu

(sau ceva de genul acesta) vă va spune câte coloane are de fapt. – 

Arran

FastMember.dll

5 Răspunsuri

Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.Sriram SakthivelThere was a conflict betweenNu adăugați coloane la dvs. Output

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesFastMember.1.5.0lib
et461FastMember.dll]. (TaskId:19)
1>          C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesFastMember.1.5.0lib
et461FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesFastMember.1.5.0lib
et461FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesClosedXML.0.94.2lib
et46ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesClosedXML.0.94.2lib
et46ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

Este clar acum de ce primiți o excepție?Project file item includes which caused reference "C:Usersksd3jvpSourceTempAIToolMisraAMSAIToolpackagesClosedXML.0.94.2lib
et46ClosedXML.dll"
Adăugați această linie înainte de a utiliza coloane pentru a remedia eroarea

ClosedXML.dllClosedXMLVă mulțumesc foarte mult pentru răspuns, dar datele care au fost luate din casetele de text și variabilele încă nu se văd în datagridview atunci când executați programul mă puteți ajuta ? – FastMember.dll 1.3.0.0user2566013FastMemberPostați ca întrebare nouă, Veți primi ajutor cu siguranță – FastMember.dll 1.5.0.0Sriram Sakthivel

ClosedXMLFlorisFastMemberEroarea spune „Indexul este în afara intervalului”. Asta înseamnă că ați încercat să indexați un obiect cu o valoare care nu este validă. Dacă ai două cărți și te rog să-mi dai a treia carte, te vei uita ciudat la mine. Acesta este computerul care se uită ciudat la tine. Ați spus – „creați o colecție”. Așa că a făcut-o. Dar, inițial, colecția este goală: nu numai că nu conține nimic, dar nu are spațiu pentru a conține nimic. „Nu are mâini”. ClosedXMLApoi ați spus: „primul element al colecției este acum „ItemID””. Iar computerul spune: „Nu mi s-a cerut niciodată să creez spațiu pentru un „prim element””. Nu am mâini pentru a ține acest element pe care mi-l oferiți.

În ceea ce privește codul dumneavoastră, ați creat o vizualizare, dar nu ați specificat niciodată dimensiunea. Aveți nevoie de o

înainte de a încerca să accesați orice coloană. Modificați

la .

    A se vedea

  1. http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.columncount.aspx

  2. Cu plăcere. Mi se pare că este același răspuns cu cel acceptat de tine, deși l-am găsit independent (și, aș putea adăuga, primul. 🙂 ) – 

    Floris

  3. Salut Floris. Am primit această eroare „column count property cannot be set on a databound datagridview control c#”, la „dataGridView1.ColumnCount = 2;” Te rog să mă ajuți să o rezolv. – 

    Sanjeev4evr

  4. @Sanjeev4evr – mesajul tău de eroare îmi sugerează că, dacă proprietatea nu poate fi setată, trebuie să fi fost definită de altceva. Poate că un „datagridview legat de date” are numărul de coloane fixat de date. Funcționează dacă omiteți acea linie? – 

    Floris

  5. Când am eliminat acea linie a aruncat aceeași excepție „Index was out of range. Trebuie să fie non-negativ și mai mic decât dimensiunea colecției. Numele parametrului: index” – 

    Sanjeev4evr

Da, mulțumesc că ați revenit la întrebarea mea. Mă puteți ajuta și altă dată. – 

Sanjeev4evr

Sachin

Ce înseamnă asta? Există vreo problemă în codul meu?
    Înseamnă că accesați o locație sau un index care nu este prezent în colecție.

  1. Pentru a găsi acest lucru, asigurați-vă că Gridview are 5 coloane, deoarece utilizați a 5-a coloană prin această linie

  2. Iată imaginea care arată elementele unei matrice. Așadar, dacă gridview-ul dvs. are mai puține coloane decât coloana

  3. prin care îl accesați, atunci apare această excepție.

meilke

are probabil o lungime mai mică de 5. Accesarea

atunci va fi în afara listei.

Vă mulțumesc foarte mult pentru răspuns – 

user2566013

Kamran Binyamin

Această eroare este cauzată atunci când ați activat paginarea în vizualizarea Grid. Dacă doriți să ștergeți o înregistrare din grilă, atunci trebuie să faceți ceva de genul acesta.

Sper că acest lucru răspunde la întrebare.