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?
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!"
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)