Entwickler-Ecke

Basistechnologien - Stringwerte in ausführbaren Code umwandeln


mats74 - Mo 14.11.11 11:42
Titel: Stringwerte in ausführbaren Code umwandeln
Hallo zusammen

Ich habe folgende Problematik zu lösen:

Ich habe einen Stringinhalt, der einer Anweisung entspricht ...

C#-Quelltext
1:
String text = "if (1 == 1) {// mach was ...} else {// mach auch was ...}";                    

... und sollte diesen Inhalt (Klartext) im compilierten Programmcode als IF-Anweisung ausführen lassen.

Der Inhalt des Textes kommt aus einer SQL-DB oder einem Textfile und kann auf jedem Client beliebig verändert werden (natürlich gemäss einer Systax, die ich dem User als Richtlinie vorgebe).

Wie kann ich diesen Klartext als ausführbaren Code auslösen? (Ist es überhaupt möglich?)

Bis jetzt sehe ich die Lösung in irgendeinem Parser-Konstrukt, der den Klartext entsprechend verarbeitet.
Da habe ich aber leider keine Idee, wie ich es angehen soll und bin um jeden Tipp oder Idee dankbar.


Horschdware - Mo 14.11.11 12:38

Stichworte für eine Google-Suche dürften hier "Reflection" und "eval()" sein.


Ralf Jansen - Mo 14.11.11 13:19

Wenn dir der konkrete Syntax noch egal ist würde ich einfach eine der vorhanden Scripting Sprachen verwenden. Also zum Beispiel csscript [http://www.csscript.net/].

Alternativ könntest du in der Datenbank doch auch eine kompilierte Assembly hinterlegen und nicht einfach ein Script? Ist vermutlich deutlich performanter.


Th69 - Mo 14.11.11 13:26

Hallo mats74,

Wenn es sich um korrekten C#-Code (bzw. VB.NET) handelt, dann wäre CodeDOM das richtige Stichwort für dich, s. z.B. Formelparser [http://www.mycsharp.de/wbb2/thread.php?threadid=32073] oder noch ausführlicher auf CodeProject einige Artikel dazu:
http://www.codeproject.com/KB/cs/codedom_assistant.aspx
http://www.codeproject.com/KB/dotnet/CompilingWithCodeDom.aspx
http://www.codeproject.com/KB/recipes/CodeDomExpEval.aspx
http://www.codeproject.com/KB/dotnet/CodeFromCode.aspx
http://www.codeproject.com/KB/recipes/codedomparser.aspx

Einen anderen Artikel mit C#-Code habe ich auch noch unter Using CodeDOM to generate CSharp (C#) and VB code [http://blogs.msdn.com/b/thottams/archive/2006/08/16/701872.aspx] gefunden.

Und dann gibt es noch einen Wrapper für CodeDOM: http://www.codeproject.com/KB/cs/refly.aspx


mats74 - Mo 14.11.11 14:48

:dance2: ... huiuiui.
So viele gute Ansatzpunkte auf einmal und ich dachte schon, das wird nix.
Da muss ich mir zuerst einen Überblick der verschiedenen Möglichkeiten verschaffen, welche für meine Bedürfnisse die geeignetste ist.
Also ab ins stille Kämmerchen und brüt, brüt, brüt ... melde mich wieder.

Vielen Dank fürs Erste.


mats74 - Di 15.11.11 16:41

Hallo zusammen

Ich habe mich für die Funktionalität der Reflektion [http://msdn.microsoft.com/de-de/library/system.reflection.aspx] und der CodeDomProvider-Klasse [http://msdn.microsoft.com/de-de/library/system.codedom.compiler.codedomprovider.aspx] entschieden.
Ich erstelle nun zur Laufzeit für die extern gespeicherten Codefragmentstücke eine separate Assembly im Arbeitsspeicher.
Dabei ist zu beachten, dass die zur Laufzeit erzeugten Assembly in einer separaten Anwendungsdomäne erstellt wird, da sonst Konflikte unter den verschiedenen Assemblys entstehen können (Programmabsturz).
Nach dem Verarbeiten der Assembly sollte die neu erstellte Anwendungsdomäne wieder vollständig geleert werden.
Somit ist meine Aufgabe gelöst :wink: .