.Net Picking falsch referenzierte Baugruppenversion

141

Ich habe gerade ein vorhandenes Projekt auf eine brandneue Maschine kopiert, um mit der Entwicklung zu beginnen, und bin auf ein Problem mit der Version einer meiner Assemblys gestoßen, auf die verwiesen wird (eine Telerik-DLL, wie es passiert).

Das Projekt hat ursprünglich auf eine ältere Version der Assembly verwiesen (nennen wir sie v1.0.0.0). Auf meinem neuen Computer ist die neueste Version der Assembly installiert, daher dachte ich, ich hätte sie aktualisiert (nennen wir die neue Version v2.0.0.0).

Hier ist das Problem: Wenn ich die alte DLL v1.0.0.0 in den Projektordner kopiere und als Referenz hinzufüge, wird die Website problemlos gestartet. Wenn ich diesen Verweis lösche (und auch die alte DLL von meinem System lösche) und die neue Version (v2.0.0.0) hinzufüge, zeigt die Seite die folgende Ausnahme:

Datei oder Assembly 'XXXXXX, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 121fae78165ba3d4' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

Der Code sucht eindeutig nach der veralteten Version und kann sie nicht finden. Aber wieso?

Ich habe den Lösungsordner nach dieser Versionsnummer durchsucht und konnte keine einzige Referenz finden. Ich habe den Text der .csproj-Datei überprüft und festgestellt, dass die Version die neueste Version korrekt anzeigt und der HintPath den Pfad zur neuen DLL korrekt anzeigt. Da ich die alte DLL nicht auf dem System installiert habe, wird sie in meinem GAC nicht angezeigt (obwohl v2.0.0.0 dies erwartungsgemäß tut).

Ich habe dann den Fusionsprotokoll-Viewer aktiviert, um herauszufinden, warum er nach dieser alten Version sucht, aber kein Glück:

Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.


=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
 (Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Alles, was es sagt, ist, dass es damit beginnt, nach dieser alten Baugruppe zu suchen. Ich habe versucht, online eine Lösung zu finden und habe diese ähnliche SO-Frage gesehen , aber es scheint das genaue Gegenteil meines Problems zu sein. Das Programm dieses Fragestellers fand die falsche DLL anstelle der referenzierten. Mein Problem ist, dass das Programm auf mysteriöse Weise nach der falschen DLL sucht und diese nicht finden kann, wenn die richtige lokal im bin-Ordner und im GAC gefunden wird.

Warum sucht ich nach der alten Version? Wo sonst kann ich suchen, um diese schlechte Referenz zu finden?

Michael La Voie
quelle

Antworten:

151

Ich vermute, dass eine andere Assembly, die Sie verwenden, auf die alte DLL verweist. Kennen Sie alle anderen verwendeten Projektreferenzen und haben einige einen Verweis auf die Telerik-DLLs?

Können Sie eine verbindliche Weiterleitung in Ihre web.config-Datei wie diese einfügen?

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
Chris Conway
quelle
12
Ich hatte alle möglichen ähnlichen Probleme mit verschiedenen Versionen, die geladen / nicht geladen wurden. Ein weiterer Trick, den Sie versuchen können, besteht darin, alle Dateien in Ihrem Ordner C: /WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files / root / 90233b18 / 10d54998 manuell zu löschen. Manchmal bereinigt ASP.Net diesen Ordner beim Neukompilieren von Websites nicht, da einige Dateisperren bestehen und diese DLLs möglicherweise an alten Referenzen hängen. Es ist einen Versuch wert, ich weiß, dass es in der Vergangenheit für mich funktioniert hat.
Chris Conway
1
Sie haben ein ähnliches Problem für mich gelöst - danke! Ein geerbtes Formular in meiner C # -Anwendung wurde im Designer nicht geöffnet, da nach einer alten Version einer Referenz gesucht wurde. Es stellte sich heraus, dass ursprünglich eine andere Referenz erstellt wurde, während auf diese alte Version der Problemreferenz verwiesen wurde.
Sam Skuce
2
Wenn Sie über die Syntax wandern
Junior Mayhé
1
Danke Chris! Sie haben mein Problem hier gelöst: stackoverflow.com/q/11490177/7850
Shaul Behr
3
Sie können auch in Ihrer App.config oder web.config nachsehen, ob vorhandene <dependentAssembly>Einträge das Problem verursachen.
Roy Tinker
24

Ich bin mit Chris Conway in diesem Fall (habe ihn positiv bewertet). Das Problem ist, dass Sie auf eine der Telerik-Assemblys in Ihrem Projekt verweisen, die auf eine andere verweist, die nicht vorhanden ist.

Das erste: Ich würde KEINE Baugruppen von Anbietern (dh Telerik) im GAC installieren. Teleriks Material besteht ohnehin aus nur zwei Baugruppen (telerik.web.design und telerik.web.ui). Stellen Sie diese einfach mit der Anwendung bereit.

Zweitens wird es in jeder Ihrer .proj-Dateien (wie .csproj) eine geben, <reference include..>die auf die Datei Telerik.Web.UI verweist. Diese enthält normalerweise eine Versionsnummer. Stellen Sie sicher, dass die Assembly, die Sie in den Ordner bin gelegt haben, mit dieser Version übereinstimmt.

Stellen Sie drittens sicher, dass ALLE Ihre Projekte die neueste Baugruppe verwenden. Stellen Sie außerdem sicher, dass die Baugruppe von einem lokalen Pfad anstelle des GAC abgerufen wird. (Ich mag das GAC wirklich wirklich nicht. Es hat bei einigen Projekten, an denen ich teilgenommen habe, unzählige Probleme verursacht.) Wir haben normalerweise einen Ordner "Assemblies", den alle Projekte für externe Assemblyreferenzen verwenden.

Viertens durchsucht Visual Studio Ihren GAC automatisch jedes Mal, wenn ein Website-Projekt geladen wird, und richtet die Montageorte neu aus, wenn etwas im GAC gefunden wird. Ich kann mich nicht erinnern, ob dies jemals für Webanwendungsprojekte der Fall ist, aber ich hatte das Problem schon lange nicht mehr damit. Dies kann während der Bereitstellung ähnliche Probleme verursachen.

Fünftens können Sie Versionsnummern für Assemblys in der web.config neu binden. In diesem runtime/assemblybindingAbschnitt können Sie Folgendes verwenden, um jede 2008 bereitgestellte Telerik-Baugruppe vorwärts zu bringen und auf eine ganz bestimmte Version zu verweisen:

  <dependentAssembly>
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
  </dependentAssembly>
Nicht ich
quelle
2
Ich meinte "fühlen", das stört mich jetzt seit Monaten :)
Michael La Voie
21

Ich habe die meisten Antworten ausprobiert, konnte sie aber immer noch nicht zum Laufen bringen. Das hat bei mir funktioniert:

Klicken Sie mit der rechten Maustaste auf Referenz -> Eigenschaften -> ändern Sie 'Spezifische Version' in false.

Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft.

RayLoveless
quelle
30
Das ist es, was die Abstimmung mit +1 bedeutet.
xr280xr
7
Aber manchmal fasst die einfache Gegenstimme einfach nicht genug zusammen, wie glücklich und erleichtert die Antwort Sie macht - nachdem Sie stundenlang versucht haben, ein dummes Problem zu beheben, das nicht einmal ein Problem sein sollte, und Sie versuchen, es auf eine andere Weise zu googeln , stoßen Sie auf eine andere Antwort als zuvor und boomen Sie! es funktioniert jetzt! Nach all dem wird manchmal das einfache Drücken des Upvote-Knopfes dem überwältigenden Gefühl nicht gerecht, Alter, du hast mich wirklich aus diesem herausgeholt.
Michael Plautz
7

Versuchen:

  • Bereinigen temporärer Projektdateien
  • Bereinigen von Build- und Obj-Dateien
  • Reinigung alter Versionen installiert bei C:\Users\USERNAME\.nuget\packages\

Das hat bei mir funktioniert.

Delira
quelle
1
Ich habe das Verzeichnis C: \ Users \ USERNAME \ .nuget \ packages \ bereinigt. Vielen Dank!
Herdo
Für eine saubere alte Nuget-Version auf einem Windows-basierten Computer starten und suchen Sie nach "Ausführen"> Kopieren und Einfügen von "% userprofile% \. nuget \ packages" - dies öffnet den Ordner mit den Nuget-Versionen
E.Meir
3
  1. Wechseln Sie zu C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
  2. Suchen Sie die Datei machine.config
  3. im Notizblock öffnen
  4. Konflikt dll finden
  5. Entfernen Sie diese und speichern Sie.

Zusammenstellungsbaugruppen

addassembly = dllName, Version = 1.0.0000.0000 Culture = neutral, PublicKeyToken = "QWEWQERWETERY"

Zusammenstellung von Baugruppen

funktioniert bei mir.

Reynan de la Cruz
quelle
2
Ich habe auch diesen Albtraum entdeckt - selbst wenn Sie Assembly aus GAC entfernen, bleiben falsche Versionsreferenzen in "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config"
Evalds Urtans
3

Dies ist keine klare Antwort darauf, warum, aber wir hatten dieses Problem, hier sind unsere Umstände und was es gelöst hat:

Dev 1:

Die Lösung enthält Projekt A, das auf ein NuGet-Paket verweist, und ein MVC-Projekt, das auf Projekt A verweist. Aktivierte die NuGet-Paketwiederherstellung und aktualisierte dann das NuGet-Paket. Es wurde ein Laufzeitfehler festgestellt, bei dem die NuGet-Bibliothek nicht gefunden wurde. Der Fehler besteht jedoch darin, dass nach der älteren, nicht aktualisierten Version gesucht wird. Lösung (und das ist lächerlich): Setzen Sie einen Haltepunkt in der ersten Codezeile des MVC-Projekts, das Projekt A aufruft. Treten Sie mit F11 ein. Gelöst - hatte nie wieder ein Problem.

Dev 2:

Gleiche Lösung und Projekte, aber der magische Haltepunkt und der Schritt in der Lösung funktionieren nicht. Überall nach Versionsumleitungen oder anderen fehlerhaften Verweisen auf dieses Nuget-Paket gesucht, Paket entfernt und neu installiert, bin gelöscht, obj, Asp.Net Temp, nichts hat es gelöst. Schließlich wurde in Projekt A umbenannt und das MVC-Projekt ausgeführt - behoben. Es wurde wieder in seinen ursprünglichen Namen umbenannt und blieb unverändert.

Ich habe keine Erklärung dafür, warum das funktioniert hat, aber es hat uns aus einem ernsthaften Ruck herausgeholt.

Chris Moschini
quelle
2

Haben Sie andere Projekte in dieser Lösung? (Möglicherweise hat ein anderes Projekt auf eine alte Version verwiesen.) Normalerweise erstreckt sich die DLL-Abhängigkeit in VS über alle Projekte in der Lösung.

AspNetDev
quelle
Keine anderen Projekte in Lösung und keine anderen referenzierten DLLs, die auf Telerik verweisen. Ich
Michael La Voie
2

Mein Problem war, dass sich die alten Assemblys im Ordner _bin_deployableAssemblies unter der Webanwendung befanden. Dies bedeutete, dass die alten Baugruppen die GAC-Baugruppen beim Erstellen des Projekts überschrieben.

Warrickh
quelle
2

Falls jemand anderes 3 Stunden spart ... war mein Fall etwas anders. Mein Code verwendete DevExpress v11.1 v11.1.4.0. Ich hatte alles korrekt in meinem Code referenziert. Der .net-Speicherprofiler hat jedoch DevExpress v11.1 v11.1.12.0 im GAC installiert. Tatsächlich waren es nicht die Komponenten, auf die ich verwiesen habe, sondern diejenigen, auf die sie intern verwiesen haben, die fehlgeschlagen sind. Versuchen Sie es wie ich könnte, der GAC wird immer zuerst überprüft. Es wurde kompiliert und lief einwandfrei, aber ich konnte den Win Forms Designer nicht sehen und der Stack Trace war überhaupt keine Hilfe. Schließlich deinstallierte .net Memory Profiler und alles wurde wiederhergestellt.

RichieRich
quelle
2

Ich hatte ein ähnliches Problem und musste alles aus den Ordnern bin und obj löschen und neu erstellen, um mein Problem zu lösen. Hoffe das hilft.

Edd
quelle
1

Wenn dieses Problem beim Testen und / oder Debuggen der Anwendung in der Visual Studio-Umgebung (ASP.NET Development Server) auftritt, müssen alle temporären Dateien im Ordner der Entwicklungswebsite gelöscht werden. Um zu erfahren, wo sich dieser Ordner befindet, suchen Sie im Windows-Taskleistensymbol nach dem ASP.NET Development Server-Symbol (es sollte den folgenden Titel haben: ASP.NET Development Server - Port ####), klicken Sie mit der rechten Maustaste auf das Symbol und wählen Sie Anzeigen Einzelheiten; Wenn Sie dann im Feld Physischer Pfad den temporären Ordner angeben, sollten alle Elemente dort gelöscht werden, um das Problem zu lösen. Erstellen Sie die Website und führen Sie sie erneut aus. Das Problem sollte behoben sein (erneut für die Entwicklungsumgebung gelöst).

Gedeon
quelle
1

Ich hatte das gleiche Problem mit verschiedenen Assemblys, die auf verschiedene Versionen von Newtonsoft.json verweisen. Die Lösung, die für mich funktioniert hat, war das Ausführen des Update-Pakets über die Nuget Package Manager-Konsole.

brando
quelle
1

Dieser Fehler war etwas irreführend - ich habe einige DLLs geladen, für die eine x64-Architektur angegeben werden musste. In der .csprojDatei:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
    <OutputPath>bin\Release-ABC</OutputPath>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Ein fehlender PlatformTargetFehler hat diesen Fehler verursacht.

Ben
quelle
1

Ich bekam:

Datei oder Assembly 'XXX-new-3.3.0.0' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

Es war, weil ich den Namen der Versammlung von XXX.dllin geändert habe XXX-new-3.3.0.0.dll. Das Zurücksetzen des Namens auf das Original behebt den Fehler.

mimo
quelle
Ja - hat eine Version in den Namen unserer allgemeinen Assemblybibliothek aufgenommen, um Namensprobleme bei der Quellcodeverwaltung zu vermeiden. Der Name wurde zurück geändert und die Verweise / Hinweispfade manuell aktualisiert, und alles hat funktioniert.
Mathew Paxinos
0

Es ist fast so, als müssten Sie Ihren Computer auslöschen, um die alte DLL loszuwerden. Ich habe bereits alles oben Genannte ausprobiert und dann den zusätzlichen Schritt ausgeführt, einfach jede Instanz der DLL-Datei auf meinem Computer zu löschen und alle Verweise aus der Anwendung zu entfernen. Es wird jedoch immer noch gut kompiliert und wenn es ausgeführt wird, verweist es auf die DLL-Funktionen. Ich fange an mich zu fragen, ob es irgendwo von einem Netzlaufwerk darauf verweist.

SQLKing
quelle
0

Ich hatte die gleiche Meldung beim Wechsel zwischen zwei Versionen einer Anwendung, die auf verschiedene Versionen derselben DLL verwiesen. Obwohl ich in verschiedenen Ordnern getestet habe, habe ich versehentlich die neuere Version über die ältere Version kopiert.

Als erstes muss also die Version der DLL überprüft werden, auf die im Ordner der Anwendung verwiesen wird. Nur für den Fall.

Carl Onager
quelle
0

Vielleicht hilft das oder vielleicht auch nicht. Ich habe meine Debug- und Release-Versionen bereinigt und dann den OBJ-Ordner umbenannt. Das hat mich endlich durchgebracht. Vorherige Schritte waren im Wesentlichen das Entfernen von Referenzen durch Projekte und das Hinzufügen dieser Referenzen zu den Projekteigenschaften.

Tim
quelle
0

In My Visual Studio 2015 habe ich sichergestellt, dass die Referenzpfadliste des fehlerhaften Visual Studio-Projekts leer ist:

Geben Sie hier die Bildbeschreibung ein

crazyTech
quelle
Sie haben genau die gleiche Antwort auf 2 verschiedene Fragen gepostet?
AK47
0

Das hat bei mir funktioniert:

Ich habe die Microsoft.IdentityModel.Clients.ActiveDirectoryVersion 3.19 in einem Klassenbibliotheksprojekt verwendet, aber nur Version 2.22 im eigentlichen ASP.NET-Webanwendungsprojekt installiert. Durch das Upgrade auf 3.19 im Web-App-Projekt habe ich den Fehler behoben.

in Flammen
quelle
0

In meinem Fall hatte ich 3 Projekte, 1 Hauptprojekt und 2 Unterprojekte, auf die vom Hauptprojekt verwiesen wird. Also habe ich das Hauptprojekt aktualisiert und das Unterprojekt weggelassen. Dort war der Konflikt. Nachdem ich mein gesamtes Projekt aktualisiert hatte, funktionierte alles einwandfrei.

Siphamandla Held Ngwenya
quelle
0

In VS2017 habe ich alle oben genannten Lösungen ausprobiert, aber nichts funktioniert. Wir verwenden Azure-Entwickler für die Versionierung.

  1. Im Team-Explorer> Versionsverwaltungs-Explorer

Geben Sie hier die Bildbeschreibung ein

  1. Wählen Sie das Projekt aus, das Sie lange verrückt macht

  2. Klicken Sie mit der rechten Maustaste auf den Zweig oder die Lösung> Erweitert> Bestimmte Version abrufen

Geben Sie hier die Bildbeschreibung ein

  1. Stellen Sie dann sicher, dass Sie das Kontrollkästchen zum Überschreiben von Dateien gemäß Screenshot aktiviert haben

Geben Sie hier die Bildbeschreibung ein

Ragavan Rajan
quelle
0

In meinem Fall habe ich versehentlich die falsche Version des Telerik-Pakets von nuget ausgewählt, wobei nuget dann jedes Paket, auf das ich verwiesen habe, durch die falsche Version ersetzte. Anschließend wurde eine verbindliche Weiterleitung zur falschen Version eingefügt, sodass selbst nachdem ich alles durch die richtige Version ersetzt hatte, immer noch nach der falschen Version gesucht wurde.

Karl Dembeck
quelle