2009-08-12 5 views
2

Ich mache einen IRC-Bot in C#, und ich hätte gerne die Funktion, Plugins zu laden ... zum Beispiel: Es wäre eine Textdatei mit etwas Code drin, und dann das Programm würde den Inhalt dieser Textdatei AS CODE ... in eine Funktion importieren ... wie ist das möglich?Plugins/Module für mein C# -Programm

Antwort

0

Sie möchten vielleicht in die CSharpCodeProvider Klasse schauen. Es gibt einen Beispielcode in this question.

Darüber hinaus gibt es die Möglichkeit, DLLs vorzukompilieren und die späte Bindung zu verwenden, um diese zur Laufzeit zu laden.

Abgesehen von all dem können Sie eine Skript-Engine wie Lua in Ihr Programm einbetten.

Die kurze Antwort ist, es gibt alle möglichen Optionen, es hängt davon ab, was genau Sie erreichen wollen, welche Lösung am besten ist.

In den ersten beiden Beispielen würden Sie sich die Schnittstellenprogrammierung ansehen, Sie müssten eine Schnittstelle in einer zweiten DLL definieren, gegen die Sie kompilieren können, dann einen bestimmten Namen aus der Baugruppe per Reflektion ziehen und zuweisen es zu einer Variablen des Interface-Typs und Aufrufe dagegen.

Ich habe noch nie Lua benutzt, aber der Artikel, den ich verlinkt habe, sollte erklären, wie man ihn benutzt.

0

Sie müssen sich für dynamische Codekompilierung suchen (siehe http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm, http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/article.php/c10729/, http://www.codeproject.com/KB/cs/Dynamic_Code_Generation.aspx)

Glaubst du nicht, es wäre besser, wenn die Plugins zu laden in als DLLs durch Reflexion statt? Dynamischer Code würde nicht signiert werden, so dass Sie nicht überprüfen können, dass der Code von einer vertrauenswürdigen Quelle stammt. Dadurch könnten die Benutzer Ihres Programms auf sehr bösartigen Code zugreifen.

+0

Es kommt darauf an. Manchmal möchten Sie eine dynamische Kompilierung, da der Code, den Sie kompilieren, vom Benutzer bereitgestellt wird (z. B. eine Art von Skriptsystem). –

+0

Ah, das ist ein guter Punkt dort. Als er "plugins" sagte, war das, was ich mir vorstellte, nicht unbedingt Scripting. – Fooberichu

1

Ich empfehle entweder C#-script oder eine DLR-Sprache wie IronPython (ich würde letzteres bevorzugen). Aber wie bereits erwähnt, ist es nicht sicher, Code auszuführen, den Ihr Programm erhält - eine klügere Idee wäre, eine Vertragsschnittstelle zu definieren und die Plugins (die diese Schnittstelle implementieren) in signierten Assemblys zu akzeptieren.

2

Ich mache das gleiche für eine MUD server. Dieser Server verfügt sowohl über kompilierte Plugins als auch über Code-Plugins, die Sie verwenden möchten. Ich habe meine eigene Skript-Engine mit CodeDom erstellt, aber das war ziemlich mühsam. Ich wechselte zu CS-Script. So verwenden wir jetzt MEF für kompilierte Plugins und CS-Script für Code-Plugins.

+0

Kannst du darüber sprechen, warum es ein Problem war? Ich habe selbst mit CodeDom gerollt (ironischerweise für einen MUD-Client), und es ist ziemlich einfach, aber trotzdem einfach zu benutzen, zu erweitern und so weiter. –

+0

Mit CodeDom für einfache Plugins ist Braindate einfach. Die Dinge werden jedoch viel komplizierter, wenn Sie versuchen, ein bereits geladenes Plugin zu entladen und/oder zu ersetzen. Dies beinhaltete hauptsächlich das Laden der Assemblies in eine andere Anwendungsdomäne.Alles andere war für mich ein Ärgernis. Ich wollte ein MUD nicht ein ganzes Plugin-Framework bauen, daher mein Kommentar. –

0

danke alles für die Hilfe, aber ich bin auf der Suche nach Code zwischen dem importierten Code und dem Hauptcode zu teilen, zum Beispiel wäre es eine Textdatei, und beim Laden des Hauptprogramms, würde es diese Textdatei öffnen und laden es als eine Funktion ... eine Funktion, die Code wie öffentliche Strings und Ints teilen und andere Funktionen aktivieren könnte, Befehle und Objekte usw. verwenden usw. ... ist das möglich?