Ist es möglich, ein Objekt zur Laufzeit zu instanziieren, wenn ich nur den DLL-Namen und den Klassennamen habe, ohne einen Verweis auf die Assembly im Projekt hinzuzufügen? Die Klasse implementiert eine Schnittstelle. Sobald ich die Klasse instanziiert habe, werde ich sie in die Schnittstelle umwandeln.
Baugruppenname:
library.dll
Modellname:
Company.Project.Classname
EDIT: Ich habe nicht den absoluten Pfad der DLL, Assembly.LoadFile
wird also nicht funktionieren. Die DLL befindet sich möglicherweise im Anwendungsstamm, im System32 oder sogar im GAC.
quelle
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Berücksichtigen Sie die Einschränkungen der verschiedenen
Load*
Methoden. Aus den MSDN- Dokumenten ...Weitere Informationen zu Ladekontexten finden Sie in den
LoadFrom
Dokumenten.quelle
Activator.CreateInstance sollte funktionieren.
Hinweis: Der Typname muss der vollständig qualifizierte Typ sein.
Beispiel:
quelle
TypeName
muss voll qualifiziert sein. Ich musste das so nennen:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
Und das gibt eine zurückObjectHandle
. Um zu Ihrer Benutzeroberfläche zu gelangen, müssen SieObjectHandle.UnWrap()
Ich fand diese Frage und einige Antworten sehr nützlich, hatte jedoch Pfadprobleme, sodass diese Antwort das Laden der Bibliothek durch Auffinden des Bin-Verzeichnispfads abdeckte.
Erste Lösung:
Zweite Lösung
Sie können dasselbe Prinzip für Schnittstellen verwenden (Sie würden eine Klasse erstellen, aber in eine Schnittstelle umwandeln), z.
Dieses Beispiel gilt für Webanwendungen, ähnliche können jedoch auch für Desktopanwendungen verwendet werden. Nur der Pfad wird beispielsweise auf unterschiedliche Weise aufgelöst
quelle
Es ist einfach.
Beispiel aus MSDN:
Hier ist ein Referenzlink
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
quelle
Ab Framework v4.5 können Sie Activator.CreateInstanceFrom () verwenden , um Klassen in Assemblys einfach zu instanziieren. Das folgende Beispiel zeigt, wie es verwendet wird und wie eine Methode aufgerufen wird, die Parameter übergibt und den Rückgabewert abruft.
quelle
Ja. Ich habe derzeit keine Beispiele, die ich persönlich gemacht habe. Ich werde später posten, wenn ich welche finde. Grundsätzlich verwenden Sie Reflection, um die Baugruppe zu laden und dann die für Sie erforderlichen Typen zu ziehen.
In der Zwischenzeit sollten Sie über diesen Link loslegen:
Verwenden von Reflection zum Laden nicht referenzierter Assemblys zur Laufzeit
quelle
quelle
Sie können eine Assembly mit den Methoden * Assembly.Load ** laden. Mit Activator.CreateInstance können Sie neue Instanzen des gewünschten Typs erstellen. Beachten Sie, dass Sie den vollständigen Typnamen der Klasse verwenden müssen, die Sie laden möchten (z. B. Namespace.SubNamespace.ClassName ). Verwenden der Methode InvokeMember des Typs Klasse können Sie Methoden für den Typ aufrufen.
Berücksichtigen Sie außerdem, dass eine Assembly nach dem Laden erst entladen werden kann, wenn auch die gesamte AppDomain entladen wurde (dies ist im Grunde ein Speicherverlust).
quelle
Je nachdem, wie wichtig diese Art von Funktionalität für Ihr Projekt ist, sollten Sie etwas wie MEF in Betracht ziehen, das das Laden und Zusammenbinden von Komponenten für Sie übernimmt.
quelle
Auf diese Weise können Sie Funktionen verwenden, die nicht dazu dienen, methodinfo abzurufen und dann aufzurufen. Diese Instanz von MyType.MethodName () gefällt Ihnen. Sie können Intellisense jedoch nicht verwenden, da dynamische Typen zur Laufzeit und nicht zur Kompilierungszeit eingegeben werden.
quelle
Ja, Sie möchten die statische Load-Methode für die Assembly-Klasse verwenden und dann die CreateInstance-Methode für die Assembly-Instanz aufrufen, die Sie vom Aufruf von Load erhalten haben.
Sie können auch eine der anderen statischen Methoden aufrufen, beginnend mit "Laden" für die Assembly-Klasse, abhängig von Ihren Anforderungen.
quelle
Sie können diese Dinge auf folgende Weise tun:
quelle