Wie kann ich eine Assembly laden und alle seine Abhängigkeiten zur Laufzeit in C # für Reflexion?

StackOverflow https://stackoverflow.com/questions/59220

  •  09-06-2019
  •  | 
  •  

Frage

Ich bin ein Dienstprogramm für mich zu schreiben, zum Teil als eine Übung in C # Reflection Lernen und zum Teil, weil ich will eigentlich das resultierende Werkzeug für die eigenen Gebrauch.

Was ich nach grundsätzlich die Anwendung bei einer Anordnung zeigt, und eine gegebene Klasse, von der Auswahl von Eigenschaften aus, das in einem exportierten HTML-Formular als Felder aufgenommen werden sollte. Das Formular wird dann in meinem ASP.NET MVC-app als Beginn einer Ansicht verwendet werden.

Als ich Subsonic Objekte für die Anwendungen bin mit dem ich verwenden möchte, sollte dies sinnvoll sein, und ich dachte, dass durch zu wollen Dinge enthalten wie die Ausgabe von HTML unterschiedlichen Datentyp abhängig, Spiegelung war die Art und Weise dieses zu erhalten getan .

Was ich suche, aber scheint schwer zu sein. Ich versuche, die DLL / EXE zu nehmen, die durch den Openfiledialog als Startpunkt gewählt sind und laden Sie es:

String FilePath = Path.GetDirectoryName(FileName);
System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);

Das funktioniert gut, sondern weil Subsonic-generierten Objekte tatsächlich voll sind von Objekttypen, die in Subsonic.dll definiert sind, usw., diese abhängigen Objekte werden nicht geladen. Geben Sie:

AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();

Auch das, enthält genau das, was ich würde es erwarten. Aber was ich versuche, herauszufinden, wie diese Versammlungen zu laden, so dass meine Gräben in meine Objekte richtig funktionieren. Ich verstehe, dass, wenn diese Assemblys im GAC oder im Verzeichnis der laufenden ausführbaren war, konnte ich sie nur durch ihren Namen laden, aber das ist wahrscheinlich nicht der Fall ist für diesen Anwendungsfall sein, und es ist mein primärer Anwendungsfall.

Also, was es läuft darauf hinaus, wie lade ich eine gegebene Montag und alle seine willkürlichen Anordnungen mit einem Dateinamen beginnen und zu einem vollständig Reflection-durchsuchbaren Baum von Typen, Eigenschaften, Methoden, etc.

Ich weiß, dass Werkzeuge wie Reflector dies zu tun, ich kann einfach nicht die Syntax findet es zu bekommen.

War es hilfreich?

Lösung

Ein paar Möglichkeiten:

  1. Schließen Sie ein anderes AppDomain.AssemblyResolve LoadFile und zu tun, basierend auf der gewünschten Baugruppe.
  2. Spin andere AppDomain mit dem Verzeichnis als Basis und die Baugruppen in diesem AppDomain laden.

Ich würde empfehlen Option verfolgen 2, da diese wahrscheinlich sauberer sein und ermöglichen es Ihnen, nachdem alle diese Baugruppen zu entladen. Auch Ladeanordnungen in der reflexions nur Kontext betrachten, wenn Sie nur über sie reflektieren müssen (siehe Assembly.ReflectionOnlyLoad).

Andere Tipps

ich gearbeitet Kent Boogaart 's zweite Option. Im Grunde hatte ich an:

1.) Implementieren Sie die ResolveEventHandler in einer separaten Klasse, von MarshalByRefObject erben und das Hinzufügen des Serializable Attribut.

2.) Fügen Sie den aktuellen ApplicationBase, im Wesentlichen, wo der DLL-Ereignishandler ist, an dem AppDomain PrivateBinPath.

Sie können den Code finden auf Github .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top