Dynamisch laden einer DLL-Datei aus einem bestimmten Ordner?
Im moment habe ich diesen code :
var shellViewLibrary = Assembly.LoadFrom(Path.Combine(_DllsPath, _DllShellView));
IEnumerable<Type> types = shellViewLibrary.GetTypes();
foreach (Type type in types)
{
var typeIShellViewInterface = type.GetInterface(_NamespaceIShellView, false);
if (typeIShellViewInterface != null)
{
//here
}
}
Die Sache ist, dass, wo ich //here
ich will Activator.CreateInstance
um ein Objekt zu erstellen, dessen Typ type
in einem bestimmten Ordner (außerhalb der build-Ordner)
Ich habe versucht, etwa 20 verschiedene Dinge, die meisten von Ihnen mit dieser : http://msdn.microsoft.com/en-us/library/d133hta4.aspx
aber keiner funktioniert...
Die typische Sache, die ich versucht habe, ist :
object MyObj = Activator.CreateInstance(shellViewLibrary.FullName, type.FullName);
oder
object MyObj = Activator.CreateInstance(Path.Combine(_DllsPath, _DllShellView), type.FullName);
Bekam ich immer andere Ausnahme, die häufigsten sind :
XamlParseException
Ich das Gefühl, dass ich nicht mit Aktivator.CreateInstance, die in der richtigen Weise mit 2 Parametern. Was soll ich tun ?
XamlParseException
tritt auf, wenn es wurde ein Fehler mit dem Parsen der XAML-Code. Es sollte eine innere Ausnahme, so dass, wenn Sie Debuggen, um die Linie, die Sie sollten in der Lage sein, sich in die XamlParseException
und finden Sie die Quelle. Es klingt wie Sie möglicherweise etwas fehlt, dass die Assembly
Ihr versuchen zu laden erfordert.Wenn ich wechsle meine Argumente für "Activator.CreateInstance", ich habe den gleichen Fehler, so dass ich wirklich das Gefühl, wie etwas ist ganz falsch :/
Ich würde empfehlen, die Verpackung Ihrer Aktivator.CreateInstance, die in einem try-catch-und debugging - an der Stelle der Ausnahme gefangen Blick auf die inneren Ausnahmen wie ich und Samuel Slade gesagt haben. Noch weitere code in Ihrem Q es scheint nicht, dass die Verwendung von Aktivator oder Montage.Laden ist das problem, sondern eher ein Fehler in einer Xaml-Datei verwendet, die von einem Steuerelement instanziiert wird von Aktivator.CreateInstance
InformationsquelleAutor Guillaume Slashy | 2012-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einmal rufen Sie diese Zeile
Die assembly geladen wurde, im Gedächtnis zu behalten. So lange wie Sie angeben-Typen korrekt aus, werden Sie in der Lage sein zu Aktivator verwenden.CreateInstance zur Erstellung der Typen. dh: Es ist nicht notwendig, weitere angeben wo der Typ ist.
Bezüglich der Aktivator, von MSDN die CreateInstance-Methode kann ein System akzeptieren.Typ. Ich würde nur verwenden Sie diese Methode in Ihrem if-Anweisung:
Was ich versuchen würde, zu tun, zu Debuggen, dies ist zuerst die Art und dann pass es in CreateInstance. Sie können feststellen, dass der Typ die Schöpfung selbst ist nicht (aufgrund von nicht aufgelösten Versammlung) oder die Instantiierung von Typ (aufgrund der Ausnahme im Konstruktor). Auf den ersten Blick hier Ihren code scheint korrekt zu sein:
In Ihrer Frage, die Sie angeben, dass Sie immer ein
XamlParseException
. Es klingt für mich wie der Typ in Frage ist ein UserControl (oder eine andere bezieht sich auf eine WPF-Xaml-Ressource-Datei) und es ist ein Fehler in der Xaml-Datei verwendet wird, d.h. nichts zu tun mit Ihrem Gebrauch von der Montage.Laden oder Aktivator.CreateInstance.Könnten Sie versuchen, die Buchung der inneren Ausnahme(N) zu erhalten eine bessere Idee, was das problem ist?
InformationsquelleAutor Dr. ABT
Dies ist ein Beispiel von "Dynamisch Laden .dll aus einem Bestimmten Ordner zur Laufzeit.
Dies hat mich eine Weile zu arbeiten, so hoffe ich, es ist von einigem nutzen...
Es sollte Ihnen einen guten Hinweis darauf, was schief läuft, wenn Sie Schritt durch den code im debug-Modus. Sie müssen auch wissen, den Namen des Namespaces und Klassennamen werden Sie den Aufruf dieser Methode. Zusätzlich der obige code ist die übergabe von Parametern zu .dll. Wenn Sie nicht wissen, welche Parameter zu übergeben, die aufgerufene Funktion diese kann auch ein Problem sein...
InformationsquelleAutor MoonKnight
Check-out MEF und PRISMA. MEF ist ein dependency-injection-Bibliothek, die hilft, mit dieser. Laden Sie alle Ihre Abhängigkeiten aus einem bestimmten Ordner, und machen Sie dynamisch geladen.
PRISMA ist ein Muster, das nutzt dependency injection und funktioniert Super mit MEF zu laden Bibliotheken dynamisch
InformationsquelleAutor joe_coolish
wenn Sie versuchen, eine Typ mit der Activator-Klasse aus einer DLL, die außerhalb Ihrer Anwendung ist, müssen Sie Sie zunächst laden Sie dieses DLL in Ihrer Anwendung Domäne.
Der einfachste und Schnellste Weg dies zu tun ist durch die Verwendung der Montage.LoadFile Methode.
mehr Informationen über diese Methode finden Sie hier : http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfile.aspx
Wenn die Versammlung ordnungsgemäß geladen ist, können Sie den Aktivator zum erstellen einer Instanz vom Typ in der DLL.
Wir verwenden diese Mechaniker ausführen von benutzerdefiniertem code in unsere Applikation.
LoadFile untersucht die 'Identität' der DLL und überprüft die Versionen der Assemblys in der Erwägung, dass LoadFrom dies nicht tut und nur packt der passenden version. LoadFile erlaubt das laden verschiedener Versionen von Assemblys.
Wenn Sie Lesen Sie die f. sorgfältig, Sie werden sehen, er hat ja schon die Art und die assembly geladen wurde
Er fügte hinzu, dass, es war dort ursprünglich nicht. Also danke, aber ich habe gelesen die Frage
ok, fair genug!
InformationsquelleAutor codingbunny
Ich bin mir nicht sicher, was Sie damit meinen:
Eine Art existiert nur in einer Baugruppe. Pfad ist völlig irrelevant für die Typen .NET
Ich übernehmen, die durch "path" Sie wirklich meinen "namespace", was bedeutet, dass Sie nicht wissen, in welchem namespace der Typ vorhanden ist. Sie haben bereits geladen, die Versammlung in Ihrem code. Untersuchen Sie die Baugruppe mit einer Reflexion zu finden, die Art, die Sie suchen. Dann übergeben Sie die
Type
- Objekt repräsentiert den Typ, den Sie suchen, um aufActivator.CreateInstance
Sobald Sie die assembly geladen, es in den Speicher. Es gibt Regeln .NET hat zum laden von Assemblys, die von remote-Laufwerke (ich misremember Ihnen im moment, aber ich werde Sie nachschlagen), aber sobald die assembly geladen wird, Activator.CreateInstance instanziieren Typen für Sie, sofern Sie es sagen, welche Art Sie wollen, instanziieren.
InformationsquelleAutor Randolpho