Forum: PC-Programmierung C# MEF Module based Applikations / Module zur Laufzeit entfernen


von Thorsten (Gast)


Lesenswert?

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?

von Thorsten (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Sven W. (Gast)


Lesenswert?

Hallo Thorsten,
es gibt ein recht schönes Tutorial für MEF. Vielleicht hilft der 
folgende Link ("Lebensdauer der Imports kontrollieren").

https://stefanhenneken.wordpress.com/2013/01/21/mef-teil-11-neuerungen-unter-net-4-5/

MfG Sven W.

von Bert3 (Gast)


Lesenswert?

>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?

von Thorsten (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.