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
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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.