Autor Beitrag
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Mo 14.11.11 11:42 
Hallo zusammen

Ich habe folgende Problematik zu lösen:

Ich habe einen Stringinhalt, der einer Anweisung entspricht ...
ausblenden 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.

_________________
Gruss
mats74
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Mo 14.11.11 12:38 
Stichworte für eine Google-Suche dürften hier "Reflection" und "eval()" sein.

_________________
Delphi: XE - OS: Windows 7 Professional x64

Für diesen Beitrag haben gedankt: mats74
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

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

Für diesen Beitrag haben gedankt: mats74
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 oder noch ausführlicher auf CodeProject einige Artikel dazu:
www.codeproject.com/...dedom_assistant.aspx
www.codeproject.com/...lingWithCodeDom.aspx
www.codeproject.com/.../CodeDomExpEval.aspx
www.codeproject.com/...et/CodeFromCode.aspx
www.codeproject.com/...s/codedomparser.aspx

Einen anderen Artikel mit C#-Code habe ich auch noch unter Using CodeDOM to generate CSharp (C#) and VB code gefunden.

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

Für diesen Beitrag haben gedankt: mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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.

_________________
Gruss
mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 15.11.11 16:41 
Hallo zusammen

Ich habe mich für die Funktionalität der Reflektion und der CodeDomProvider-Klasse 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: .

_________________
Gruss
mats74