Typ konnte aufgrund eines Montagefehlers nicht geladen werden

120

Ich habe den folgenden einfachen Test geschrieben, um zu versuchen, das fließende Interface von Castle Windsor zu lernen:

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    } 
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1); 
        }
    }
}

Wenn ich den Test über TestDriven.NET ausführe, wird folgende Fehlermeldung angezeigt:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

Wenn ich den Test über die NUnit-GUI ausführe, erhalte ich:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Wenn ich die Assembly öffne, auf die ich in Reflector verweise, kann ich folgende Informationen sehen:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

und dass es definitiv Castle.MicroKernel.Registration.IRegistration enthält

Was könnte los sein?

Ich sollte erwähnen, dass die Binärdateien aus dem neuesten Build von Castle stammen, obwohl ich noch nie mit nant gearbeitet habe, sodass ich mich nicht darum gekümmert habe, aus dem Quellcode neu zu kompilieren, sondern nur die Dateien im bin-Verzeichnis übernommen habe. Ich sollte auch darauf hinweisen, dass mein Projekt problemlos kompiliert werden kann.

George Mauer
quelle

Antworten:

111

Befindet sich die Assembly im Global Assembly Cache (GAC) oder an einem beliebigen Ort, an dem möglicherweise die Assembly überschrieben wird, von der Sie glauben, dass sie geladen wird? Dies ist normalerweise das Ergebnis des Ladens einer falschen Assembly. Für mich bedeutet dies, dass normalerweise etwas im GAC vorhanden ist, das die Version in bin / Debug überschreibt.

Eric Schoonover
quelle
1
Ich habe die Assemblys hinzugefügt, indem ich zu den DLL-Dateien navigiert habe, damit der GAC nicht in die Gleichung eingeht. Klicken Sie auch mit der rechten Maustaste auf die Baugruppe -> Im Reflektor öffnen vom Lösungs-Explorer, um sie im Reflektor mit allen Informationen anzuzeigen, die ich erwarten würde
George Mauer
7
Es spielt keine Rolle, wie Sie es hinzugefügt haben, wenn eine Assembly mit demselben Namen / derselben Version im GAC vorhanden ist, wird diese geladen.
Eric Schoonover
1
VS.NET listet den Pfad zu der von Ihnen ausgewählten Assembly auf und Reflector öffnet die richtige Assembly. Wenn die Anwendung die .NET-Laufzeit ausführt, wird die GAC-Assembly geladen.
Eric Schoonover
11
Dies ist das zweite Mal, dass diese Antwort meinen Hintern gerettet hat. Ich würde es wieder abstimmen, wenn ich könnte.
Whybird
17
(GAK. Sagen Sie es laut. Der Klang des Namens warnt Sie davor, wie es ist.)
Whybird
131

Wenn ein Projekt auf ein anderes Projekt verweist (z. B. ein Windows-Anwendungstyp, der auf eine Klassenbibliothek verweist) und beide denselben Assemblynamen haben, wird diese Fehlermeldung angezeigt. Sie können das referenzierte Projekt entweder stark benennen oder (noch besser) die Baugruppe des referenzierenden Projekts umbenennen (auf der Registerkarte "Anwendung" der Projekteigenschaften in VS).

AndrewS
quelle
Außerdem: Versuchen Sie, den Ausgabeordner zu bereinigen. Wahrscheinlich kann das Umbenennen von Bibliotheken dasselbe Problem verursachen, da beide (alte und neue) im selben Ausgabeordner abgelegt werden.
Manushin Igor
Wenn Sie ein Projekt ausschneiden und einfügen und nicht alle Felder korrekt bearbeiten, kann dies zu diesem Problem führen!
Michael Parker
1
Das war es für mich, ich hatte bereits auf die Assembly in der referenzierten Klassenbibliothek verwiesen. Ich musste in die Datei web.config meines Webprojekts gehen und die Referenz <dependantAssembly> entfernen, nachdem ich das Paket in nuGet deinstalliert hatte, damit es funktioniert.
Ivan
16

Die Lösung für mich wurde oben nicht erwähnt, also dachte ich, ich würde meine Antwort dem langen Schwanz hinzufügen ...

HttpHandlerAm Ende hatte ich einen alten Verweis auf eine Klasse (an ) in web.config, die nicht mehr verwendet wurde (und keine gültige Referenz mehr war). Aus irgendeinem Grund wurde es beim Ausführen in Studio ignoriert (oder ist diese Klasse in meinem Entwickler-Setup noch verfügbar?), Und daher wurde dieser Fehler erst angezeigt, als ich versuchte, ihn auf IIS bereitzustellen. Ich habe nach dem Assemblynamen in web.config gesucht, die nicht verwendete Handlerreferenz entfernt, dann ist dieser Fehler behoben und alles funktioniert hervorragend. Hoffe das hilft jemand anderem.

Brian Moeskau
quelle
1
Hatte etwas sehr ähnliches, war der einzige Unterschied, dass der web.config-Verweis auf die DLL noch im bin-Verzeichnis bereitgestellt wurde. Diese Binärdatei bezog sich wiederum auf eine alte Version einer gemeinsam genutzten DLL, die die Ausnahme verursachte.
Santos
10

Ich hatte das gleiche Problem und für mich hatte es nichts mit Namespace- oder Projektnamen zu tun.

Aber wie mehrere Benutzer angedeutet haben, hat dies damit zu tun, dass auf eine alte Assembly immer noch verwiesen wird.

Ich empfehle, alle "bin" / binären Ordner aller Projekte zu löschen und die gesamte Lösung neu zu erstellen. Dadurch wurden möglicherweise veraltete Assemblys ausgewaschen, und danach exportierte MEF alle meine Plugins ohne Probleme.

Matthias Wolf
quelle
8

Ich habe diesen Fehler erhalten und nichts, was ich auf StackOverflow oder anderswo gefunden habe, hat ihn gelöst, aber die Antwort von bmoeskau von auf diese Frage hat mich in die richtige Richtung für das Update geführt, das noch nicht als Antwort erwähnt wurde. Meine Antwort bezieht sich nicht ausschließlich auf die ursprüngliche Frage, aber ich poste sie hier unter der Annahme, dass jemand, der dieses Problem hat, durch Durchsuchen von Google oder Ähnlichem hierher kommt (wie ich in einem Monat, wenn mich das wieder beißt) , arg!).

Meine Baugruppe befindet sich im GAC, daher ist theoretisch nur eine Version der Baugruppe verfügbar. Außer, dass IIS die alte Version hilfreich zwischenspeichert und mir diesen Fehler gibt. Ich hatte gerade die Baugruppe im GAC geändert, umgebaut und neu installiert. Eine mögliche Lösung besteht darin, den Task-Manager zu verwenden, um w3wp.exe zu beenden . Dies zwingt IIS, die Baugruppe erneut aus dem GAC zu lesen: Problem gelöst.

Michael Maddox
quelle
3

Version = 1.0.3.0 zeigt Castle RC3 an, die fließende Schnittstelle wurde jedoch einige Monate nach der Veröffentlichung von RC3 entwickelt. Daher haben Sie anscheinend ein Versionsproblem. Vielleicht haben Sie Castle RC3 im GAC registriert und es verwendet dieses ...

Mauricio Scheffer
quelle
Interessanterweise habe ich hier den neuesten Build erhalten: builds.castleproject.org/cruise/DownloadBuild.castle?number=956 Das haben sie in ihrem Forum empfohlen. Auch wenn dies der Fall wäre, stelle ich mir vor, dass das Projekt überhaupt nicht kompiliert werden würde. Aber das kompiliert kein Problem
George Mauer
Was die Version im GAC angeht, tue ich das wahrscheinlich, aber ich habe die Referenz aus dem GAC nicht hinzugefügt, und die Verwendung eines Reflektors für die Referenz zeigt an, dass es die ist, die ich dachte
George Mauer
Versuchen Sie, die doppelte Baugruppe aus dem GAC zu entfernen. Ich bin bereit, das ist Ihr Problem.
Eric Schoonover
3

Ich bekomme das gelegentlich und es war immer schlecht, die Versammlung im GAC zu haben

SteveC
quelle
3

Wenn dieser Fehler durch das Ändern des Namespace verursacht wird, stellen Sie sicher, dass der Ordner dieses Projekts in denselben Namen umbenannt wird, und schließen Sie VS.NET. Bearbeiten Sie das Projekt, bei dem das Problem mit Notepad auftritt, und ersetzen Sie dort die Knoten

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> "AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace" AssemblyName>

Iadine GOUNDETE
quelle
3

Das Löschen meiner PDF-Datei für die DLL löste dieses Problem für mich. Ich vermute, es hat etwas mit der Tatsache zu tun, dass die DLL mit ILMerge erstellt wurde.

Shelby115
quelle
Das war es für mich! Ich weiß nicht, was ILMerge ist, aber Epicor mochte es nicht, die PDF-Datei neben meiner Assembly zu haben.
MDave
Kein ILMerge, aber das Löschen aller PDB-Dateien hat das Problem behoben.
Hogarth45
3

Wenn ich auf ein solches Problem stoße, finde ich das FUSLOGVW-Tool sehr hilfreich. Es überprüft die Bindungsinformationen der Baugruppe und protokolliert sie für Sie. Manchmal fehlen die Bibliotheken, manchmal werden in GAC verschiedene Versionen geladen. Manchmal verursacht die Plattform der referenzierten Bibliotheken die Probleme. Dieses Tool macht deutlich, wie die Bindungen der Abhängigkeiten aufgelöst werden, und dies kann Ihnen wirklich helfen, Ihr Problem zu untersuchen / zu debuggen.

Fusion Log Viewer / fuslogvw / Assembly Binding Log Viewer. Weitere Informationen / Download hier: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .

Jakub Szumiato
quelle
Gibt es eine Möglichkeit, FUSLOGVW mit Visual Studio Designer zum Laufen zu bringen? Visual Studio Designer löst eine Ausnahme aus, wenn ich versuche, einen meiner Dialoge ("Methode nicht gefunden") für eine mir bekannte Methode zu bearbeiten (die App läuft einwandfrei). Soweit ich sehen kann, wird in FUSLOGVW nichts angezeigt, wenn etwas in Visual Studio Designer bearbeitet wird.
Jimmy
3

Ich hatte dieses Problem, nachdem ich einen Klassennamen berücksichtigt hatte:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Stoppen von IIS und Löschen des Inhalts in Temporary ASP.NET Files es für mich behoben.

Abhängig von Ihrem Projekt (32/64-Bit, .net-Version usw.) unterscheidet sich das Richtige Temporary ASP.NET Files:

  • 64 Bit
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 Bit
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Auf meinem Entwicklungscomputer war es (weil es vielleicht IIS Express ist?)
    %temp%\Temporary ASP.NET Files
CJSewell
quelle
3

Vielleicht nicht so wahrscheinlich, aber für mich wurde es dadurch verursacht, dass meine Anwendung versuchte, eine Bibliothek mit demselben Assemblynamen zu laden (xxx.exe beim Laden von xxx.dll).

ReflexiveCode
quelle
2

Laufen Sie einfach mit einer anderen Ursache darauf:

Ausführen von Komponententests im Release-Modus, aber die geladene Bibliothek war die Debug-Modus-Version, die nicht aktualisiert wurde

jk.
quelle
2

Noch eine andere Lösung: Alte DLLs, die aufeinander verweisen und von Visual Studio in zwischengespeichert werden

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

Beenden Sie VS, löschen Sie alles in diesem Ordner und Bob ist Ihr Onkel.

grinsender Mann
quelle
2

Ich hatte das gleiche Problem. Ich habe dies gerade behoben, indem ich die Assembly über GAC aktualisiert habe.

Um Gacutil auf einer Entwicklungsmaschine zu verwenden, gehen Sie zu : Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Ich habe diese Befehle zum Deinstallieren bzw. Neuinstallieren verwendet.

gacutil /u myDLL

gacutil /i "C:\Program Files\Custom\mydllname.dll"

Hinweis: Ich habe meine DLL nicht deinstalliert, in meinem Fall habe ich gerade die DLL mit dem aktuellen Pfad aktualisiert.

gaurav
quelle
2

Ich bin auf dieses Szenario gestoßen, als ich versucht habe, einen Typ (über Reflection) in eine Assembly zu laden, die für eine andere Version einer Referenz erstellt wurde, die für die Anwendung gilt, in der dieser Fehler aufgetreten ist.

Da ich sicher bin, dass der Typ in beiden Versionen der Baugruppe unverändert ist, habe ich einen benutzerdefinierten Baugruppenauflöser erstellt, der die fehlende Baugruppe der von meiner Anwendung bereits geladenen Baugruppe zuordnet. Am einfachsten ist es, der Programmklasse einen statischen Konstruktor hinzuzufügen:

using System.Reflection
static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "<AssemblyName>")
        {
            // Load assembly from startup path
            return Assembly.LoadFile($"{Application.StartupPath}\\<AssemblyName>.dll");
        }
        else
        {
            return null;
        }
    };
}

Dies setzt natürlich voraus, dass sich die Assembly im Startpfad der Anwendung befindet und einfach angepasst werden kann.

JBartlau
quelle
Ich sollte beachten, dass diese Lösung für Fälle gilt, in denen Sie Ihre Baugruppen an Dritte weitergeben und nicht sicherstellen können, dass alle rechtzeitig aktualisiert werden, wenn Sie dies tun. Andernfalls ist eine Neukompilierung mit den korrigierten Referenzen vorzuziehen.
JBartlau
2

Laufen Sie einfach mit einer anderen Ursache darauf:

Ich habe eine zusammengeführte Assembly verwendet, die mit ILRepack erstellt wurde. Die Assembly, von der Sie die Typen abfragen, muss die erste sein, die an ILRepack übergeben wird. Andernfalls sind ihre Typen nicht verfügbar.

Jenny O'Reilly
quelle
1

Dies geschieht normalerweise, wenn Sie eine Version Ihrer Assembly im GAC bereitgestellt haben, diese jedoch nicht mit neuen Klassen aktualisiert wurde, die Sie möglicherweise der Assembly in Ihrer IDE hinzugefügt haben. Stellen Sie daher sicher, dass die Assembly im GAC mit Änderungen aktualisiert wird, die Sie möglicherweise in Ihrem Projekt vorgenommen haben.

Wenn Sie beispielsweise über eine gemeinsame Klassenbibliothek verfügen und in dieser Klassenbibliothek den Typ Common.ClassA haben, stellen Sie diesen für den stark benannten GAC bereit. Sie kommen später und fügen einen anderen Typ mit dem Namen Common.ClassB hinzu. Sie führen Ihren Code auf Ihrer IDE aus, ohne zuvor die Änderungen, die Sie am GAC von Common vorgenommen haben, mit dem neu hinzugefügten Common.ClassB-Typ bereitzustellen.

Dumisa
quelle
1

Ich habe den gleichen Fehler erhalten, nachdem ich eine referenzierte DLL in einem ausführbaren Desktop-Projekt aktualisiert habe. Das Problem bestand darin, dass die hier erwähnten Personen eine alte Referenz bezogen und einfach zu beheben waren, aber hier nicht erwähnt wurden. Daher dachte ich, dass dies die Zeit anderer Personen sparen könnte.

Wie auch immer, ich habe DLL A aktualisiert und den Fehler von einer anderen referenzierten DLL erhalten. Nennen wir es hier B, wo DLL A einen Verweis auf DLL B hat.

Das Aktualisieren von DLL B hat das Problem behoben.

Hamid Heydarian
quelle
1

Hinzufügen Ihrer DLL zu GAC (globaler Assemblycache)

Visual Studio-Eingabeaufforderung => Als Administrator ausführen

gacutil / i "DLL-Dateipfad"

Sie können die hinzugefügte Assembly C: \ Windows \ system32 \ sehen

Es wird auch die fehlende DLL oder "Datei oder Assembly konnte nicht geladen werden" in der SSIS-Skriptaufgabe behoben

Ezhil Arasan
quelle
1
Ich werde bemerken, dass das Hinzufügen von Dingen zum GAC normalerweise eine schlechte Idee ist, die Bereitstellung erschwert und im Allgemeinen etwas ist, von dem sich sogar Microsoft zurückzieht.
George Mauer
1

In Visual Studio 2017 ist ein ähnliches Problem aufgetreten, bei dem MSTest als Testframework verwendet wurde. Ich habe System.TypeLoadException-Ausnahmen erhalten, als einige (nicht alle) Komponententests ausgeführt wurden, aber diese Komponententests wurden beim Debuggen bestanden. Ich habe letztendlich Folgendes getan, um das Problem zu lösen:

  1. Öffnen Sie die Datei Local.testsettings in der Lösung
  2. Gehen Sie zu den Einstellungen "Unit Test"
  3. Deaktivieren Sie das Kontrollkästchen "Ladekontext für Assemblys im Testverzeichnis verwenden". Kontrollkästchen

Nach diesen Schritten wurden alle Komponententests beim Ausführen bestanden.

Chris
quelle
1

Ich habe das gleiche wie oben erlebt, nachdem ich das Signieren von Baugruppen in der Lösung entfernt hatte. Die Projekte würden nicht bauen.

Ich fand heraus, dass eines der Projekte auf das StrongNamer NuGet-Paket verwies, das den Erstellungsprozess modifiziert und versucht, nicht signierte Nuget-Pakete zu signieren.

Nachdem ich das StrongNamer-Paket entfernt hatte, konnte ich das Projekt erneut erstellen, ohne die Assemblys zu signieren / stark zu benennen.

Larsbj
quelle
-2

Ich habe dies nur behoben, indem ich den Befehl iisreset über die Eingabeaufforderung ausgeführt habe ... Immer das erste, was ich mache, wenn ich solche Fehler erhalte.

Bas Wiebing
quelle
4
Es tut mir leid, aber das hat nichts mit der Frage zu tun, macht Annahmen über die Verwendung von iis und erklärt nicht, was das Problem verursacht.
George Mauer