2015-03-05 8 views
7

Ich versuche, eine Instanz einer Klasse zu erstellen, die in einem DLL-Plug-In in meinem Projekt implementiert ist, um die Typentdeckung durchzuführen. Ich erhalte diese Ausnahme:Activator.CreateInstance: Konnte den Typ von Assembly nicht laden

Typ konnte nicht 'Action' laden von der Montage 'SquidReports.DataCollector.Plugin.BES, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'.

Dies ist die genaue Methode Unterschrift Ich verwende: https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx

Mit anderen Worten, ich bin versucht, das Objekt auf der Grundlage der Assembly-Namen und den Klassennamen, um zu laichen, etwa so:

Ein wichtiger Teil hier ist, dass ich den 'kurzen' Namen der Assembly im Gegensatz zu dem 'vollen' Namen (einschließlich Version, Kultur und PublicToken) verwende. jedoch MSDN eindeutig fest:

‚assembly‘ eine der folgenden sein kann: Der einfache Name eines Montage, ohne Pfad oder Dateierweiterung.

  • Zum Beispiel würden Sie angeben TypeExtensions für eine Baugruppe, deren Pfad und Namen sind . \ Bin \ TypeExtensions.dll.

  • Der vollständige Name einer signierten Assembly, die aus ihrem einfachen Namen, Version, Kultur und öffentlichen Schlüsseltoken besteht; zum Beispiel "TypeExtensions, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = 181869f2f7435b51".

Insbesondere, ich versuche, eine Instanz der Klasse ‚Aktion‘ in der "SquidReports.DataCollector.Plugin.BES Versammlung definiert zu erstellen. Ich referenziere explizit diese Assembly als mit Direktive am Anfang der exakt gleichen * .cs-Datei, wo ich versuche, die Instanz zu erstellen.

Ich habe folgende Vorschläge aus früheren Fragen/Antworten versucht:

Reinigen Sie Ihre Lösung aus, wieder aufbauen und versuchen Sie es erneut Dies scheint in einigen ASP.NET-Projekten zu arbeiten, aber das ist nur alte Konsolenanwendung.

die referenzierten Baugruppen in Ihrer Konfigurationsdatei überprüfen Auch dies ist eine einfache Konsolenanwendung, die nur den GAC und Bibliotheken in den verschiedenen Projekten der gleichen Lösung

1. Stellen Sie sicher, dass die Montage in der verwendet wird korrektes Arbeitsverzeichnis:

Hier sind wir ...

It's right there!!!

2.Sicherstellen, dass die Montage ist die gleiche Version auf der Festplatte

Yup ...

Looks the same

3. Die endgültige Empfehlung zu verwenden Fuslogvw.exe war.

Ich habe keine Erfahrung mit dem Tool, aber es gibt eine Sache, die ich seltsam fand. Nach dem Ausführen der Debug-Sitzung, eine Long- Namen und Kurznamen Version meiner Versammlung auftauchte:

Hmmm...

hatte ich einen Blick auf beiden Protokollen.

Die Kurzbezeichnung Version scheint einige Warnungen zu generieren:

=== Pre-bind Zustandsinformationen ===

LOG: Displayname = SquidReports.DataCollector.Plugin.BES Partial) WRN: Teilbindungsinformationen wurden für eine Baugruppe geliefert:

WRN: Assemblyname: SquidReports.DataCollector.Plugin.BES | Domain-ID: 1

WRN: Eine partielle bind tritt auf, wenn nur ein Teil des Namens Montageanzeige vorgesehen ist.

WRN: Dieses im Bindemittel führen möglicherweise eine falsche Montage zu laden.

WRN: Es wird empfohlen, eine vollständig spezifizierte Textidentität für die Baugruppe,

WRN: die von dem einfachen Namen, die Version, die Kultur und Public-Key-Token besteht.

WRN: Weitere Informationen und allgemeine Lösungen zu diesem Problem finden Sie im Whitepaper http://go.microsoft.com/fwlink/?LinkId=109270.

... aber es endet mit erfolgreich geladen, und es erwähnt deutlich meine Montage an der richtigen Stelle:

LOG: Der Versuch, Download neuer URL file: /// C:/Quelle /C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL.

Das Protokoll für die lange benannte Version enthält keine verdächtigen Nachrichten.

Weitere Ideen?

BEARBEITEN: Hier ist eine minimale Definition der Action-Klasse. Es ist eine reine Modellklasse.

ICollectible Schnittstelle und [Key] Attribut sind Teil einer weiteren Baugruppe. Nicht sicher, ob das Auswirkungen hätte?

BEARBEITEN 2: Wie Erik unten hervorhebt, habe ich natürlich genau die gleichen Prüfungen an dieser ANDEREN Baugruppe durchgeführt.

+0

Können Sie die minimale Definition des Typs 'Action' posten? –

+0

Hat 'Action' einen statischen Konstruktor? Es könnte eine Ausnahme auslösen. Wenn dies der Fall ist, sollte dies in der InnerException-Eigenschaft der Ausnahme gefunden werden, deren Nachricht Sie oben zitiert haben. Auch wenn das nicht das Problem ist, könnte es etwas anderes in der InnerException geben, das Ihnen helfen könnte, dies herauszufinden. – phoog

+0

Sind Sie absolut sicher, dass sich der Typ in dieser DLL befindet? Dissamble mit Il Disassembler und schauen Sie sich die Typen in der DLL, oder verwenden Sie Reflektor (oder ein anderes Werkzeug) – brumScouse

Antwort

8

Wie Sie herausgefunden haben, wird die Baugruppe geladen, sie kann den Typ einfach nicht finden (Action). Sie müssen den vollständigen Namen des Typs Namespace.Action für .NET angeben, um es zu finden.

+0

Verstehe ich dich richtig, wenn ich annehme, dass ich SquidReports.DataCollector.Plugin.BES angeben müsste. Model.Action 'anstelle von' Action 'als zweites Argument von Activator.CreateInstance? Warum ist das? Es gibt nur eine Klasse Aktion in der Assembly definiert. –

+0

@RobinMattheussen Der Namespace muss angegeben werden, wenn der Standard-Namespace Ihrer Assembly nicht mit dem Namespace Ihres Typs übereinstimmt. d. h., Model.Action – Eric

+0

@RobinMattheussen Ja, 'Activator.CreateInstance' prüft nicht, ob es nur einen Typ mit diesem Namen gibt, und benötigt daher immer seinen vollen Namen. @Eric Ist der Standardnamespace irgendwo in der kompilierten Version einer Assembly gespeichert? Ich dachte, es wäre ein reines Visual-Studio-Projekt. –

Verwandte Themen