432 Stimmen

Es wurden Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden, die nicht aufgelöst werden konnten.

Wenn ich meine Lösung reinige und dann aufbaue, die mehrere Projekte enthält, berichtet das Ausgabefenster, dass der Build erfolgreich war. Wenn ich jedoch das Fehlerlistenfenster ansehe, zeigt es mir diese Warnung:

Es wurden Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden, die nicht aufgelöst werden konnten. Diese Referenzkonflikte sind im Buildprotokoll aufgeführt, wenn die Protokollverbosity auf ausführlich eingestellt ist. C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets

Wenn ich auf diese Nachricht doppelklicke, wird die Datei C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets geöffnet, aber ich verstehe nichts darin.

Ich benutze Visual Studio Express 2013 für das Web.

Wie finde ich heraus, was falsch ist und mit welcher DLL, und wie mache ich dann die Warnung verschwinden?

564voto

Ruben Bartelink Punkte 57310

Eta: Es gibt einen tödlichen Artikel zu diesem Thema von SO's eigenem @Nick Craver, den du lesen solltest


Während die anderen Antworten dies sagen, machen sie es nicht explizit, also werde ich es....

In VS2013.2 muss man tatsächlich die Ausgabe der zitierten Informationen auslösen, indem man die Meldung nicht liest, die besagt:

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): Warnung MSB3277: Es wurden Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden, die nicht aufgelöst werden konnten. Diese Referenzkonflikte werden im Buildprotokoll aufgeführt, wenn die Protokollverbose auf detailliert eingestellt ist.

Dies ist inkorrekt (oder zumindest war es für einige Versionen von Visual Studio so - es scheint in einem aktuellen VS2015 Update 3 oder später in Ordnung zu sein). Stattdessen stellen Sie es auf Diagnostisch um (unter Tools->Optionen->Projekte und Lösungen->Erstellen und Ausführen, setzen Sie MSBuild-Projektbauausgabe-Verbose), woraufhin Sie Meldungen wie diese sehen werden:

Es gab einen Konflikt zwischen "Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" und "Newtonsoft.Json, Version=6.0.5.17707, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed".

  • "Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" wurde ausgewählt, weil es primär war und "Newtonsoft.Json, Version=6.0.5.17707, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" nicht.

Dann

  • Strg-Alt-O, um zum Build-Ausgabefenster zu gelangen
  • Suchen Sie nach "wurde ausgewählt", um die Detailansicht zu finden.

...Und ja, für diejenigen, die sich die Details der [diagnostischen] Meldung ansehen, war es für diesen Ignoranten neu, dass es in der Stadt eine Konvention gibt, wonach alle 6.x Versionen, intern Assembly-Version 6.0.0.0 sind, d.h. nur die SemVer Major-Komponente geht in die Assembly-Version :)

79voto

Ilya Kozhevnikov Punkte 9984

Führen Sie msbuild Foo.sln /t:Rebuild /v:diag (von C:\Program Files (x86)\MSBuild\12.0\bin) aus, um Ihre Lösung von der Befehlszeile aus zu erstellen und etwas mehr Details zu erhalten. Suchen Sie dann die .csproj., die die Warnung protokolliert, und überprüfen Sie deren Verweise sowie die Verweise anderer Projekte, die dieselbe gemeinsame Assembly mit unterschiedlichen Versionen verwenden.

Bearbeiten: Sie können die Build-Verbosität auch direkt in VS2013 festlegen. Gehen Sie zu Tools > Optionen, dann zu Projekte und Lösungen und setzen Sie die MSBuild-Verbisosität auf Diagnostic.

Bearbeiten: Einige Klarstellungen, da ich gerade selbst eine gefunden habe. In meinem Fall wurde die Warnung verursacht, weil ich eine Referenz über das Resharper-Prompt hinzugefügt habe, anstatt den Dialogfeld "Referenz hinzufügen" zu verwenden, was dazu führte, dass sie ohne Versionsnummer hinzugefügt wurde, obwohl sowohl v4 als auch v12 zur Auswahl standen.

vs

Im MSBuild-Protokoll mit /v:diag -Verbosität sah es wie folgt aus, wobei Details darüber gegeben wurden, welche zwei Referenzen in Konflikt standen:-

  Es gab einen Konflikt zwischen 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." und 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." wurde gewählt, weil es primär war und 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." nicht. (TaskId:16)

      Verweise, die von "Microsoft.Build.Framework, Version=4.0.0.0, ..." abhängen 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Projektdatei-Elemente, die den Verweis "C:\...\v4.5.1\Microsoft.Build.Framework.dll" verursachten. (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      Verweisenden, der von "Microsoft.Build.Framework, Version=12.0.0.0, ..." abhängen 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Projektdatei-Elemente, die den Verweis "C:\...\v12.0\Microsoft.Build.dll" verursachten. (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Projektdatei-Elemente, die den Verweis "C:\...\v12.0\Microsoft.Build.Engine.dll" verursachten. (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): Warnung MSB3277: 
Konflikte zwischen unterschiedlichen Versionen derselben abhängigen Assembly gefunden, die nicht aufgelöst werden konnten.  
Diese Referenzkonflikte werden im Buildprotokoll aufgeführt, wenn die Protokoll-Verbosität auf detailliert eingestellt ist. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]

41voto

Alexander Christov Punkte 8620

Ich kann nur Rubens Antwort weiter unterstützen, indem ich einen Vergleich zwischen den beiden angezeigten Meldungen anstelle:

Bildbeschreibung hier eingeben

und der Meldung:

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): Warnung MSB3277: Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden, die nicht aufgelöst werden können. Diese Verweis-Konflikte werden im Buildprotokoll aufgeführt, wenn die Protokollausführlichkeit auf detailed festgelegt ist.

Also, Ruben hat recht - das ist einfach nicht wahr. Es gibt überhaupt keine Konflikte, nur eine fehlende Assembly. Dies ist besonders langweilig, wenn das Projekt eine ASP.NET-Anwendung ist, da die Ansichten bei Bedarf kompiliert werden, das heißt unmittelbar vor der ersten Anzeige. Dann wird es notwendig, die Assembly verfügbar zu haben. (Es gibt die Option, die Ansichten gemeinsam mit dem übrigen Code vorab zu kompilieren, aber das ist eine andere Geschichte.) Andererseits erhalten Sie, wenn Sie die Protokollausführlichkeit auf Diagnostic einstellen, die folgende Ausgabe:

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): Warnung MSB3245: Dieser Verweis konnte nicht aufgelöst werden. Die Assembly "System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" konnte nicht gefunden werden. Stellen Sie sicher, dass die Assembly auf der Festplatte vorhanden ist. Wenn dieser Verweis von Ihrem Code benötigt wird, können Sie Kompilierungsfehler erhalten.

Als Ergebnis müssen Sie entweder:

  1. Fügen Sie den Verweis auf die Assembly manuell hinzu (suchen Sie sie auf der Festplatte, vielleicht im GAC, und fügen Sie sie als "direkten" Verweis hinzu), oder
  2. Verwenden Sie das NuGet-Paket (falls es im Katalog veröffentlicht wurde), um es herunterzuladen und die darin enthaltene Assembly zu referenzieren.

Mehr über den NuGet-Katalog hier. Mehr über das Vorabkompilieren von ASP.NET-Ansichten hier.

23voto

sree Punkte 2163

Das Ändern der Build-Verbosity in Visual Studio hilft, in die richtige Richtung zu zeigen. Befolgen Sie die folgenden Schritte, um die Verbosity in VS zu ändern

  1. Gehen Sie zum Menü Tools->Optionen in VS
  2. Öffnen Sie Projekte und Lösungen->Build und Run
  3. Ändern Sie den Wert der MSBuild-Projektbuild-Ausgabeverbosity. Wählen Sie einen aus Quiet, Minimal, Normal, Detailed und Diagnostic

Überprüfen Sie das Ausgabefenster(Strg+Alt+O) in VS, um die Änderungen im Build-Protokoll zu sehen.

18voto

Shaswat Rungta Punkte 3377

Wiederholen eines der Kommentare von @elshev Klicken Sie mit der rechten Maustaste auf die Lösung -> Verwalten von NuGet-Paketen für die Lösung -> Unter Konsolidieren können Sie sehen, ob verschiedene Versionen desselben Pakets installiert wurden. Aktualisieren Sie die Pakete dort. Der Konfliktfehler wird behoben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X