2010-03-12 7 views
5

Ich brauche eine Plugin-Architektur innerhalb C#/net, um für eine benutzerdefinierte Datenraster/UmwandlungPlugin-Architektur in .net. Entladen

  • benutzerdefinierte benutzerdefinierte Aktionen
  • Handhabung des Datentyp Code zu laden, zu implementieren,/...

aus nicht statischen verbundenen Assemblydateien.

Da die Anwendung viele benutzerdefinierten benutzerdefinierten Aktionen behandeln muss, muss ich sie einmal entladen, um die Speichernutzung zu reduzieren.

fand ich mehrere gute Artikel über Plugin-Architekturen, zB:

aber keiner von ihnen gab mir genug Wurst für eine richtig Entladen Versammlung.

Da das Programm verteilt werden soll und die benutzerdefinierten Aktionen (wie der Name besagt) benutzerdefiniert sind: Wie kann ich verhindern, dass die Assembly schädlichen Code ausführt (zB mein Programm schließen, Dateien löschen)?

Gibt es noch andere Fallstricke, die einer von Ihnen kennen gelernt hat?

+0

So wird eine einzelne Instanz Ihrer Anwendung lange genug laufen für Sie Speicherverbrauch betroffen sein? Weil der einfachste Weg ist, zu warten, bis die Anwendung beendet wird. Funktioniert nicht so gut, wenn die Anwendung nie beendet wird! –

+0

gut, wie ich eine Client-Server-Architektur entwickeln, zumindest sollte der Server eine lange Zeit laufen (zumindest hoffe ich :-) –

+1

+1 für die Verwendung von "Wurst" in Ihrer Frage! – Eccentropy

Antwort

4

Haben Sie über die Verwendung der Add-Ins und Extensiblity-Framework von MS nachgedacht? http://msdn.microsoft.com/en-us/magazine/cc163476.aspx

Michael

+0

@Michael: behandelt dieses Framework das Entladeproblem? –

+0

@ John: Managed Addin Framework verwendet AppDomains, um die Plugin-Architektur zu implementieren, und ja, es wird entladen. Obwohl viel Code geschrieben werden muss, kann die AppDomain-Logik von Ihrem Code abstrahiert werden. –

+0

Danke, sieht aus wie ich brauche! –

4

Eine Technik besteht darin, die zusätzlichen Assemblys in eine separate AppDomain zu laden. Durch das Entladen der AppDomain werden die Assemblys entladen.

+0

Wie werden diese zusätzlichen Assemblys in der neuen AppDomain mit den Inhalten aus der Haupt-AppDomain kommunizieren? – BjarkeCK

+0

Sehen Sie, ob [DoCallBack] (http://msdn.microsoft.com/en-US/library/system.appdomain.docallback.aspx) Ihnen hilft, aber im Allgemeinen [RTFM] (http://msdn.microsoft.com). com/de-de/library/System.AppDomain.aspx). –

1

Sie können eine einzelne Baugruppe nicht entladen. Sie können eine Baugruppengruppe nur entladen, indem Sie die Anwendungsdomäne entladen, zu der sie gehören.

Dies ist im Wesentlichen, wie SQL CLR funktioniert, und ASP.NET - durch eine transiente AppDomain für von Benutzern bereitgestellte Assemblys.