Hallo, nachdem ich sehr viel in WPF mit MVVMlight gelernt hab, kann ich
mich an das nächste Thema trauen. Ich hatte schonmal zum testen kleinere
Applikationenbeispiele zum MEF getestet und viel gelesen, aber die
folgenden Punkte kann ich mir nicht richtig beantworten.
Module/Plugins können zur Laufzeit geladen werden, aber nicht entfernt
werden. Ich hab sehr schnell über >100k Module/Plugins die geladen
werden und das sehe als kritisch an, weil ich die Module/Plugins nicht
zur Laufzeit entfernen kann.
Bei der Internetsuche fand ich zwei Lösungen:
1. Statt MEF zu MAF wechseln, dann können die Module/Plugins bekommen
alle Module / Plugins eine eigene Appdomain die beendet werden kann.
2. Statt Assemblies zur erstellen war es eher exeutables zu erstellen
welche gestartet wurden.
zu 1. AppDomains machen die ganze Sache sehr schwierig bis hin zu nicht
nutzbar, weil alle Klassen, Member etc. Serialzable sein müssen und das
kann ich nicht sicher stellen wie z.b. 3rd Party Klassen für SQL.
zu 2. Die Startzeiten sind viel zu hoch. MEF benötigt zum laden und die
Init zu tätigen gerademal 3ms in meiner Testapplikationen und das
innerhalb meiner Anforderungen.
Thema Sicherheit:
1. Schadsoftware
Können wir recht gut ausschliessen, weil die Module/Plugins von uns
selber kommen und die App nur innerbetrieblich genutzt wird. 3rd Party
Libs, welche wir nutzen wurden vorab von uns geprüft und zugelassen.
2. Module / Absturz
Hier konnte ich noch keine guten Informationen finden ausser wie oben
der Punkt 1 und 2.
Meine Fragen:
1. Hat jemand noch ein Tipp, wie ich AppDomains umgehen kann und
trotzdem die Module/Plugins zur Laufzeit entfernen kann? Oder seht Ihr
bei >100k Module/Plugins keine Probleme?
2. Gibt es Möglichkeiten auch bei MEF und Module/Pluginabsturz
sicherzustellen, dass die MainApp nicht abstürzt?
Hallo, ich hab beim suchen noch eine eventuelle Möglichkeit gefunden,
welche mir die Extra Appdomain erspart.
In diesem Beispiel wird das Module in Memorystream gelesen und in meinem
Anwendungsfall koennte es passen, weil ich ein paar Module hab die nicht
zur Laufzeit geändert oder entladen müssen, die Module werden
herkömmlich geladen beim Programmstart. Die >100k Module werden nicht
zeitgleich benötigt, sondern werden gestartet und nach internen Ablauf
beendet, dazu werde ich schauen, ob ich den MemoryStream einfach löschen
kann.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/093c3606-e68e-46f4-98a1-f2396d3f88ca/how-to-unload-dll-files-that-are-in-use?forum=clr
Hallo Thorsten,
mir ist nicht ganz klar: >100k Speicherbedarf? Oder als Anzahl Module?
Bei erstem: Peanuts (auf einem Standard-PC). Bei Anzahl: Bist Du Dir
sicher, das die Architektur so in Ordnung ist?
In der Größenordnung von >100k Modulen wäre es eher sinnvoll, EIN Modul,
evtl. auch eine begrenzte Anzahl von Modul(en) zu schreiben, welch die
>100k Teile (Klassen?, ...) bei Bedarf über einen anderen Mechanismus
lädt und wieder vergisst, z.B. den Garbage Collector.
Grüße
Markus
Hallo, danke für den Post. Es sind >100k Module, welche nacheinander
ausgeführt werden und danach entladen werden, da machen sich 3 Sek.
Ladezeit bei eigner Appdomain mit Prozess schon extrem bemerkbar, auch
wenn ich diese eventuell async kurz vor ende des anderen laden würde,
eventuell muss ich mit der Zeit wirklich leben, damit die Module bei
einem Fehler nicht die Main Applikation zum Absturz bringen. Was mich am
meisten daran stört die Module in einer anderen AppDomain zu halten ist
das jede Klasse Serialzable sein muss. Hab noch ein anderes Beispiel
gefunden und werde mal die Ladzeiten etc. messen.
https://msdn.microsoft.com/en-us/magazine/dn519924.aspx
>Es sind >100k Module, welche nacheinander>ausgeführt werden und danach entladen werden
wie kommst du denn auf die Menge - was ist denn in den Modulen drinn?
Hallo,
@Sven W.
Danke, insbesondere die Neuigkeiten bzgl. Lifetime etc. sind gut.
@Bert3
Das Mainprogramm bietet einige Funktionen z.b. VDC, VAC messen, welche
als Plugins geladen werden. Die Module sind für die UserModule
benutzbar. Die Mainapplikationen bietet noch einen Sequencer an, wo der
Ablauf der einzelnen UserModule festgelegt wird. LogInterface zwischen
MainProgramm und den UserModulen ist noch nicht vorhanden, aber ist eins
der nächsten Schritte.
Die UserModule haben keine View, sondern nur eine Run Funktion, welche
von der MainApplikation gestartet wird, wie umfangreich jedes UserModule
ist, kann ich nicht sagen. Die Annahme von >100k UserModulen ist
momentan auch nur eine Schätzung, vielleicht sind es auch mal nur 10k,
aber nächsten Tag >80k.
Der Anwender soll jetzt nicht jedesmal die MainAppliaktionen schliessen,
damit er eine neue Sequenz erstellt, sondern ich würde gerne jedes
UserModule beenden und aus dem Speicher entfernen, nachdem es seine
Arbeit verrichtet hat. Die MainApplikation weiss anhand einer XML Config
Datei, welche Module vorhanden sind bzw. registiert der User die
vorhandenen Module in der Datei.
Ich gehe fest davon aus das die Module nicht behandelete Exceptions
behinhaten, deshalb bleibt wohl nur MAF mit eigner AppDomain für jedes
UserModul und somit kann ich Sie entladen.