Laden...

AppDomain kopiert Assemblies

Erstellt von gelöschtem Konto vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.023 Views
Gelöschter Account
vor 6 Jahren
AppDomain kopiert Assemblies

Hallo,

nach langer Zeit habe ich mal wieder ein problem mit dem ich so nicht weiter komme. Ein Plugin-System funktioniert über AppDomains zum dynamischen laden/entladen von Assemblies und file-locks. Dazu habe ich eine Klasse die eine Representation des Plugins ist und die AppDomain etc. beinhaltet. Die Laderoutine sieht wie folgt aus:

AppDomainSetup info = new AppDomainSetup();
            info.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            info.ShadowCopyDirectories = AppDomain.CurrentDomain.BaseDirectory;
            info.LoaderOptimization = LoaderOptimization.MultiDomain;
            info.ShadowCopyFiles = Boolean.TrueString;

            extensionSpace = AppDomain.CreateDomain(name, AppDomain.CurrentDomain.Evidence, info);
            handler = (ModuleHandler)extensionSpace.CreateInstanceAndUnwrap(typeof(ModuleHandler).Assembly.FullName, typeof(ModuleHandler).FullName);

ModuleHandler ist ein MarshallByRef-Object, dass zwei methoden beinhaltet, einerseits laden der Assembly via Assembly.LoadFrom und andererseits erzeugen von Instanzen aus dem geladenen Assembly.

Das Problem welches ich jetzt habe ist, dass ich einerseits Assembly.LoadFrom nur im AppDomain.DoCallback ausführen kann, ansonsten lädt mir .Net das Plugin-Assembly mit in die defaultDomain => fail

Das zweite Problem ist, dass ich per Reflection alle Methoden abfragen möchte, die ein bestimmtest Attribut enthalten um darauf im Hauptprogramm ein Dictionary mit Delegates zu verwalten. Funktioniert ebenfalls nicht, wenn ich das direkt über die Objekt-Instanz aufrufe da auch hier .Net die Assemlby in meine defaultDomain lädt => fail

Was ich erreichen möchte ist für eine Konsolenanwendung modular Funktionen hinzuzufügen und wieder entfernen zu können (da es für das Projekt hier relevant ist). Wie kann ich das erreichen?

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Shaarigan,

ModuleHandler ist ein MarshallByRef-Object,

Somit kannst du per Remoting die Fragen 1 und 2 erledigen?
Sonst lädt dir -- wie du ja bemerkt hast -- die Runtime die Assemblies in die Default-Domain. Via Remoting (od. sonst eine IPC für AppDomains) werden die Assemblies dann nicht geladen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Gelöschter Account
vor 6 Jahren

Frage 1 lässt sich anscheinend nur mit DoCallback aus dem ModuleHandler aufrufen, ansonsten packt mir .Net wie gesagt die geladene(n) Assembly(ies) zusätzlich mit in die defaultDomain und dann sind die natürlich gelockt auch wenn ich die AppDomain wieder entlade.

Frage 2 ist im Prinzip dasselbe, sobald allerdings die Delegates (ich mache am Ende Func<string[], ErrorCode> objekte aus den Methoden, die ich als Befehle einbinden möchte) gemarschallt werden und ich mit Hauptanwendungs-Code z.b. auf die Attribute der Methoden zugreifen möchte (via MethodInfo), um z.b. einen Hilfetext mit Parametern anzuzeigen, habe ich wieder das problem, .Net lädt das Assembly zusätzlich in die defaultDomain und lockt die Datei selbst bei entladen der Plugin-Domain (vermutlich um die Reflection ausführen zu können)