2008-08-22 12 views
21

Meine Anwendung lädt Assemblys zur Laufzeit dynamisch aus bestimmten Unterordnern. Diese Assemblys werden mit Abhängigkeiten zu anderen Assemblys kompiliert. Die Laufzeit versucht, diese aus dem Anwendungsverzeichnis zu laden. Aber ich möchte sie in das Modulverzeichnis legen.Laden von Baugruppen und ihrer Abhängigkeiten

Gibt es eine Möglichkeit, der Laufzeit mitzuteilen, dass sich die DLLs in einem separaten Unterordner befinden?

Antwort

18

Eine nette Ansatz, den ich verwendet habe, in letzter Zeit ist ein Ereignishandler für die AssemblyResolve Veranstaltung AppDomain hinzuzufügen.

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

Dann in der Methode Ereignishandler können Sie die Assembly laden, die eine der Assembly.Load, Assembly.LoadFrom Überschreibungen verwendet werden wurde versucht, aufgelöst und aus dem Verfahren zurück.

EDIT:

Basierend auf Ihren zusätzliche Informationen, die ich die Technik, die oben denke, mit, insbesondere die Hinweise auf eine Anordnung Lösung selbst ist der einzige wirkliche Ansatz, der ohne Umstrukturierung des App funktionieren wird. Was es Ihnen gibt ist, dass der Speicherort jeder Assembly, die die CLR nicht auflösen kann, durch den Code zur Laufzeit ermittelt und geladen werden kann ... Ich habe dies in ähnlichen Situationen sowohl für steckbare Architekturen als auch für eine Assemblierungsreferenzintegrität verwendet Scan-Werkzeug.

+3

Ein gutes Beispiel für diese Technik ist die Anwendung LINQPad. Es wird als einzelne exe ausgeliefert, daher sind alle Bibliotheken als eingebettete Ressourcen enthalten. Siehe http://www.albahari.com/nutshell/ch16.aspx für Code und http://www.linqpad.net/HowLINQPadWorks.aspx für Einblicke. – Pat

4

Sie können das Element <probing> in einer Manifestdatei verwenden, um der Runtime mitzuteilen, dass sie in verschiedenen Verzeichnissen nach ihren Assemblydateien sucht.

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

z.B .:

<configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="bin;bin2\subbin;bin3"/> 
    </assemblyBinding> 
</runtime> 
</configuration> 
1

Sie können das Element <codeBase> in der Anwendungskonfigurationsdatei verwenden. Weitere Informationen zu "Locating the Assembly through Codebases or Probing".

Nun, die geladene Baugruppe hat keine eine Anwendungskonfigurationsdatei.

Nun, wenn Sie die spezifischen Ordner zur Laufzeit kennen, können Sie Assembly.LoadFrom verwenden.

+0

Der erste Link gibt "Thema existiert nicht mehr". Die Angabe von .Net 4.0 bringt es jedoch: [https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en -us/library/15hyw9x3% 28v = vs.100% 29.aspx) – AnorZaken

Verwandte Themen