Waarskuwing:Konflik gevind tussen verskillende weergawes van dieselfde afhanklike vergadering

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

  •  09-06-2019
  •  | 
  •  

Vra

Ek is tans besig om 'n .NET-toepassing te ontwikkel, wat uit 20 projekte bestaan.Sommige van daardie projekte word saamgestel met .NET 3.5, ander is steeds .NET 2.0-projekte (tot dusver geen probleem nie).

Die probleem is dat as ek 'n eksterne komponent insluit, ek altyd die volgende waarskuwing kry:

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

Wat presies beteken hierdie waarskuwing en is daar dalk 'n moontlikheid om hierdie waarskuwing uit te sluit (soos die gebruik van #pragma disable in die bronkode-lêers)?

Was dit nuttig?

Oplossing

Hierdie waarskuwing beteken dat twee projekte na dieselfde samestelling verwys (bv. System.Windows.Forms) maar die twee projekte vereis verskillende weergawes.Jy het 'n paar opsies:

  1. Herstel alle projekte om dieselfde weergawes te gebruik (bv.skuif alles na .Net 3.5).Dit is die voorkeuropsie omdat alle kode loop met die weergawes van afhanklikhede waarmee hulle saamgestel is.

  2. Voeg 'n by bindende herleiding.Dit sal die waarskuwing onderdruk.Jou .Net 2.0-projekte sal egter (met looptyd) gebind wees aan die .Net 3.5-weergawes van afhanklike samestellings soos bv. System.Windows.Forms.U kan vinnig 'n bindende aanstuur byvoeg deur op fout in Visual Studio te dubbelklik.

  3. Gebruik CopyLocal=true.Ek is nie seker of dit die waarskuwing sal onderdruk nie.Dit sal, soos opsie 2 hierbo, beteken dat alle projekte die .Net 3.5 weergawe van System.Windows.Forms sal gebruik.

Hier is 'n paar maniere om die aanstootlike verwysing(e) te identifiseer:

  • Jy kan 'n nut gebruik soos die een gevind byhttps://gist.github.com/1553265
  • Nog 'n eenvoudige metode is om die uitsetvermoë in te stel (gereedskap, opsies, projekte en oplossings, bou en hardloop, MSBuild -projekbou -uitset -mondelings, gedetailleerd), en na die gebou, soek die uitsetvenster vir die waarskuwing en kyk na die teks net bo dit . (Hoedpunt aan pauloya wat dit voorgestel het in die kommentaar op hierdie antwoord).

Ander wenke

Basies gebeur dit wanneer die samestellings waarna jy verwys, "Copy Local" op "True" gestel het, wat beteken dat 'n kopie van die DLL saam met jou exe in die bin-lêergids geplaas word.

Aangesien Visual Studio ook al die afhanklikhede van 'n verwysde samestelling sal kopieer, is dit moontlik om te eindig met twee verskillende bouwerk van dieselfde samestelling waarna verwys word.Dit is meer geneig om te gebeur as jou projekte in aparte oplossings is, en kan dus afsonderlik saamgestel word.

Die manier waarop ek dit reggekry het, is om Copy Local op False te stel vir verwysings in monteerprojekte.Doen dit net vir uitvoerbare programme/webtoepassings waar jy die samestelling nodig het om die voltooide produk te laat loop.

Hoop dit maak sin!

Ek wou pauloya se oplossing wat hulle verskaf het in die kommentaar hierbo plaas.Ek glo dit is die beste oplossing om die aanstootlike verwysings te vind.

Die eenvoudigste manier om te vind wat die 'aanstootlike verwysing (s)' is, is om die opbou -uitsetvervositeit (gereedskap, opsies, projekte en oplossings, bou en bestuur, MSBUILD -projekbou -uitsetvermoë, gedetailleerd) en na die gebou in te stel, deur die uitsetvenster te soek vir die waarskuwing.Sien die teks net bo dit.

Byvoorbeeld, wanneer jy die uitvoerpaneel vir "konflik" soek, kan jy iets soos hierdie vind:

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.

Soos u kan sien, is daar 'n konflik tussen EF-weergawes 5 en 6.

Ek het dieselfde probleem met een van my projekte gehad, maar nie een van die bogenoemde het gehelp om die waarskuwing op te los nie.Ek het die gedetailleerde bou-loglêer nagegaan, ek het AsmSpy gebruik om te verifieer dat ek die korrekte weergawes vir elke projek in die geaffekteerde oplossing gebruik het, ek het die werklike inskrywings in elke projeklêer dubbel gekontroleer - niks het gehelp nie.

Uiteindelik het dit geblyk dat die probleem 'n geneste afhanklikheid was van een van die verwysings wat ek in een projek gehad het.Hierdie verwysing (A) het op sy beurt 'n ander weergawe van (B) vereis wat direk vanaf alle ander projekte in my oplossing verwys is.Die opdatering van die verwysing in die verwysde projek het dit opgelos.

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)

Ek hoop die bogenoemde wys wat ek bedoel, het my 'n paar uur geneem om uit te vind, so hopelik sal iemand anders ook baat.

Op Visual Studio as jy regskliek op die oplossing en Bestuur nuget-pakkette daar's 'n "Konsolideer" oortjie wat al die pakkette op dieselfde weergawe stel.

Ek het net hierdie waarskuwingsboodskap gehad en die oplossing skoongemaak en hersaamgestel (Bou -> Skoon Oplossing) en dit het weggegaan.

Ek het dieselfde probleem gehad en ek het opgelos deur die volgende in web.config te verander.

Dit het met my gebeur omdat ek die toepassing met Newtonsoft.Json 4.0 gebruik

Van:

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

Aan:

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

Dit hang eintlik af van jou eksterne komponent.Wanneer jy 'n eksterne komponent in 'n .NET-toepassing verwys, genereer dit 'n GUID om daardie komponent te identifiseer.Hierdie fout vind plaas wanneer die eksterne komponent waarna deur een van jou projekte verwys word, dieselfde naam en ander weergawe het as 'n ander so 'n komponent in 'n ander samestelling.

Dit gebeur soms wanneer jy "Blaai" gebruik om verwysings te vind en die verkeerde weergawe van die samestelling by te voeg, of jy het 'n ander weergawe van die komponent in jou kodebewaarplek as die een wat jy in die plaaslike masjien geïnstalleer het.

Probeer om uit te vind watter projekte hierdie konflikte het, verwyder die komponente van die verwysingslys, voeg dit dan weer by en maak seker dat jy na dieselfde lêer wys.

Ek het 'n ander manier om dit te doen as jy Nuget gebruik om jou afhanklikhede te bestuur.Ek het ontdek dat VS en Nuget soms nie ooreenstem nie en Nuget kan nie herken dat jou projekte nie gesinchroniseer is nie.Die packages.config sal een ding sê, maar die pad wat in Verwysings gewys word - Eienskappe sal iets anders aandui.

As jy bereid is om jou afhanklikhede op te dateer, doen die volgende:

  1. Klik op die projek van Solution Explorer en klik op 'Bestuur Nuget -pakkette'

  2. Kies 'Installed Packages' -oortjie in die linkerpaneel neem u geïnstalleerde pakkette op.

  3. Deïnstalleer jou pakkette.Dit is OK, ons gaan hulle dadelik terug byvoeg.

  4. Installeer onmiddellik die pakkette wat u benodig.Wat Nuget sal doen, is nie net om vir jou die nuutste weergawe te kry nie, maar sal jou verwysings verander en ook die bindende aansture vir jou byvoeg.

  5. Doen dit vir al jou projekte.

  6. Op die oplossingsvlak, doen 'n Skoon en herbou.

Jy wil dalk met die laer projekte begin en jou pad na die hoër vlaks toe werk, en elke projek herbou soos jy aangaan.

As jy nie jou afhanklikhede wil opdateer nie, kan jy die pakketbestuurderkonsole gebruik en die sintaksis Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber] gebruik

=> maak seker daar sal 'n geval van toepassing gedeeltelik geïnstalleer word.

=> verwyder eerstens daardie instansie van die verwydering van toepassing.

=> maak dan skoon, herbou en probeer ontplooi.

dit het my probleem opgelos. Hoop dit help jou ook.Beste wense.

Het ook hierdie probleem gehad - in my geval is dit veroorsaak deurdat die "Spesifieke Weergawe" eiendom op 'n aantal verwysings op waar gestel is.Deur dit na vals op daardie verwysings te verander, het die probleem opgelos.

Dit het ook met my gebeur.Daar is twee keer na een dll verwys:een keer direk (in verwysings) en een keer indirek (verwys deur 'n ander verwysde projek).Ek het direkte verwysing, skoongemaak en herboude oplossing verwyder.Probleem opgelos.

  1. Maak "Solution Explorer" oop.
  2. Klik op "Wys alle lêers"
  3. Vou "Verwysings" uit
  4. Jy sal een (of meer) verwysing(e) sien met 'n effens ander ikoon as die res.Tipies is dit met 'n geel blokkie wat voorstel dat jy 'n nota daarvan moet neem.Verwyder dit net.
  5. Voeg die verwysing terug en stel jou kode saam.
  6. Dis al.

In my geval was daar 'n probleem met MySQL-verwysing.Op een of ander manier kon ek drie weergawes daarvan onder die lys van alle beskikbare verwysings lys;vir .net 2.0, .net 4.0 en .net 4.5.Ek het proses 1 tot 6 hierbo gevolg en dit het vir my gewerk.

Nog 'n ding om te oorweeg en na te gaan, is om seker te maak dat jy nie enige diens het wat daardie bin-lêergids gebruik nie.as hulle is stop die diens en herbou oplossing

Daar blyk 'n probleem op Mac Visual Studio te wees wanneer .resx-lêers gewysig word.Ek weet nie regtig wat gebeur het nie, maar ek het hierdie probleem gekry sodra ek 'n paar .resx-lêers op my Mac geredigeer het.Ek het die projek op Windows oopgemaak, die lêers oopgemaak en dit was asof hulle nie geredigeer is nie.So ek het hulle geredigeer, gestoor, en alles het ook weer op Mac begin werk.

Ek het so 'n probleem gehad toe my projek verwys het na NETStandardLibrary en een van verwysde samestellings is vir netcore gepubliseer.Pas dit as netstandaard gepubliseer en probleem was weg

As ek NuGet gebruik het, was al wat ek moes doen:

  1. regskliek projek en klik Manage NuGet Packages..

  2. klik op die rat regs bo

  3. klik Algemene oortjie in NuGet Pakketbestuurder bo Pakketbronne

  4. merk "Slaan die toepassing van bindende aansture oor" in Binding Redirects

  5. Maak skoon en herbou en die waarskuwing is weg

Baie maklik

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top