2016-06-07 22 views
0

Ich entwickle einen "Executor", der DLLs durch Reflektion ausführen wird. Ich werde eine DLL konfigurieren, die eine bestimmte Schnittstelle implementiert, der Executor wird diese DLL laden und die Methoden basierend auf der Schnittstelle ausführen.So laden Sie eine referenzierte DLL ohne die physikalische DLL

In einigen Fällen kann die konfigurierte DLL andere referenzierte DLLs haben, die nicht im Verzeichnis enthalten sind.

Meine Frage ist: wie diese Assembly laden und ausführen nicht die physische DLL der Referenzen?

Ex:

-Executor calls DLL "A". 
-DLL "A" references DLL "B" and DLL "C". 
-DLL "B" and DLL "C" are not in the directory. 
+0

Was erwarten Sie zu passieren? Warum befinden sich die Assemblies nicht im selben Verzeichnis? Wo sind sie? Und was hast du probiert? Siehe zum Beispiel [Baugruppenreferenzen aus einem anderen Ordner auflösen] (http://stackoverflow.com/questions/5260404/resolve-assembly-references-from-another-folder), [So fügen Sie einen Ordner zum Assembly-Suchpfad zur Laufzeit hinzu. NET?] (Http://stackoverflow.com/questions/1373100/how-to-add-folder-to-assembly-search-path-at-runtime-in-net), und so weiter. – CodeCaster

+0

Wo sind sie dann? Entweder befinden sie sich in einem der Systemverzeichnisse/GAC und sie werden nur gut geladen, wenn Sie die DLL "A" laden, oder sie werden nicht gefunden und das Laden der DLL "A" schlägt fehl. – nos

+0

@nos Ich habe nicht die DLLs, die eindeutige lokale, die sie sind, ist in den Referenzen der DLL "A" :( –

Antwort

2

Wenn eine Referenz vom Assemblyloader zur Laufzeit aufgelöst wird, führt eine fehlende physische Datei immer dazu, dass der Bindungsprozess mit einer Ausnahme fehlschlägt (wenn die Anwendung den Code dieser Assembly benötigt, muss sie physisch vorhanden sein) das heißt, irgendwo im Suchpfad, einschließlich der GAC).

(Selbst wenn Sie eine Möglichkeit finden würden, den Ladevorgang abzufangen - was in .NET möglich ist - werden Sie nicht ohne die IL der referenzierten Assembly irgendwie, sei es per Download, on-demand liefern -compilation oder was auch immer).

Weitere Informationen in „Wie die Runtime Locates Assemblies“, hier: https://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.110).aspx

Ihre Idee zusätzliche Abhängigkeiten zu entfernen, obwohl Sinn macht („DLL Hell“ zu reduzieren), eine Option wäre die Zusammenlegung von mehreren voneinander abhängig zu betrachten Assemblies in einer einzigen Binärdatei, zum Beispiel dieses kostenlose Tool, das auch als NuGet-Paket verfügbar ist: http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

-1

Sie Angenommen, Sie wollen nicht, diese DLLs in das Arbeitsverzeichnis zu setzen, müssen Sie dll B und C in die Global Assembly Cache (GAC)

registrieren Sie können sich auf this Wiki-Post oder Google GAC weitere Informationen beziehen.

+0

Nein, Sie _need to_. Sie können den Sondierungsmechanismus überschreiben, die Baugruppen durchsucht. – CodeCaster