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?
<dependentAssembly>
Einträge das Problem verursachen.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/assemblybinding
Abschnitt können Sie Folgendes verwenden, um jede 2008 bereitgestellte Telerik-Baugruppe vorwärts zu bringen und auf eine ganz bestimmte Version zu verweisen:quelle
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.
Hoffe das hilft.
quelle
Versuchen:
C:\Users\USERNAME\.nuget\packages\
Das hat bei mir funktioniert.
quelle
funktioniert bei mir.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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).
quelle
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.
quelle
Dieser Fehler war etwas irreführend - ich habe einige DLLs geladen, für die eine x64-Architektur angegeben werden musste. In der
.csproj
Datei:Ein fehlender
PlatformTarget
Fehler hat diesen Fehler verursacht.quelle
Ich bekam:
Es war, weil ich den Namen der Versammlung von
XXX.dll
in geändert habeXXX-new-3.3.0.0.dll
. Das Zurücksetzen des Namens auf das Original behebt den Fehler.quelle
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.
quelle
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.
quelle
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.
quelle
In My Visual Studio 2015 habe ich sichergestellt, dass die Referenzpfadliste des fehlerhaften Visual Studio-Projekts leer ist:
quelle
Das hat bei mir funktioniert:
Ich habe die
Microsoft.IdentityModel.Clients.ActiveDirectory
Version 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.quelle
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.
quelle
In VS2017 habe ich alle oben genannten Lösungen ausprobiert, aber nichts funktioniert. Wir verwenden Azure-Entwickler für die Versionierung.
Wählen Sie das Projekt aus, das Sie lange verrückt macht
Klicken Sie mit der rechten Maustaste auf den Zweig oder die Lösung> Erweitert> Bestimmte Version abrufen
quelle
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.
quelle