C# Code aus String etc. einfügen?

Palladin007  29.07.2022, 17:16

Was für ein Code? Was heißt "aus dem String nehmen"?

TheMineGrief 
Fragesteller
 29.07.2022, 17:26

Also zum Beispiel console.writeline(„Test1“)

MagicalGrill  29.07.2022, 17:19

Heißt das, du willst im Wesentlichen, dass sich das Programm selbst zur Laufzeit umschreibt? Wenn ja, google mal nach "self modifying code", das wird mit C# gar nicht so einfach.

TheMineGrief 
Fragesteller
 29.07.2022, 17:25

Ja meinte ich

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Also willst Du im String weiteren C#-Code haben und ausführen?

Also z.B.:

var code = @"Console.WriteLine(""Test1"");" 

Execute(code);

Dann brauchst Du die Roslyn Scripting-API. Oder Du arbeitest dich in CodeDom ein, das müsste meine ich auch kompilieren können. Oder Du baust LambdaExpression, die man kompilieren kann. Oder Du nutzt Reflection.Emit und generierst den IL-Code in eine Assembly, oder Mono.Cecil, was das gleiche kann. Oder eine der vielen anderen Community-Projekte, z.B. ein Lambda-Parser.

Es gibt ne ganze Menge, aber da Du schreibst, Du hast nichts dazu gefunden, schließe ich daraus, dass Du noch blutiger Anfänger bist und dann sind diese Themen ganz sicher nichts für dich.

Außerdem ist es fast immer eine blöde Idee, sowas zu machen, meistens gibt es bessere und weit weniger komplexe Alternativen für das Vorhaben.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

TheMineGrief 
Fragesteller
 29.07.2022, 22:49

Ja, ich bin noch relativer Anfänger. Ich hab einen anderen Weg gefunden. Dieser wäre nur unkomplizierter und übersichtlicher gewesen

0
Erzesel  30.07.2022, 12:19
@TheMineGrief
Ich hab einen anderen Weg gefunden.

...würde mich brennend interessieren, welchen Weg Du gewählt hast. Aus der Hüfte viele mir da etwa das Generieren und Ausführen eines Java-/VBS-Script ein, was jedoch wenig mit C# zu tun hätte.

0
TheMineGrief 
Fragesteller
 30.07.2022, 12:25
@Erzesel

Naja, ich wollte in einen Array die Eingabe und den Code, der dann ausgeführt werden soll schreiben.

Da das jetzt nicht funktioniert muss ich halt alles einzeln mit if Abfragen.

0
TheMineGrief 
Fragesteller
 30.07.2022, 12:29
@Erzesel

Wie schon gesagt, ich wollte es nur wegen übersichtlicher machen und wusste nicht, dass das so kompliziert ist. Ich dachte man muss einfach nur z.B. ‚‚Execute(string[3,0])‘‘ machen

0
Palladin007  30.07.2022, 19:05
@TheMineGrief

Naja, wir sind hier bei einer kompilierten Sprache ;)
Bei Skript-Sprachen gibt's das häufiger, immerhin ist das Programm da auch nichts anderes als ein String, der aus einer Datei gelesen wird. Bei C# ist der Weg zum Ausführen aber deutlich komplexer.

Aber natürlich geht das, nur eben nicht so einfach, weshalb es Frameworks gibt, die das übernehmen. Aber damit ist es nie einfach nur "Execute", denn die Sprache (und damit auch diese Frameworks) kann weit mehr, als dass ein "Execute" ausreichen würde.

Aber einfach if's aneinander reihen ist - sofern das in deinem Vorhaben möglich ist - definitiv die bessere Alternative, Komplexität und Fehlerrisiko ist deutlich geringer und Performance ist deutlich besser.

Dennoch ist es (aus Architektur-Sicht) nicht gut, stattdessen solltest Du dir z.B. Command-Pattern anschauen. Nach dem Command-Pattern hast Du pro Funktion eine Command-Klasse und je nachdem, was ausgeführt werden soll, wird dann eine entsprechende Instanz davon (ggf. mit Parametern zur Einstellung) erstellt. Woanders gibt's dann etwas, was irgendetwas vorbereitet, den Command in kontrollierter Umgebung ausführt und anschließend aufräumt - je nachdem, was dein Vorhaben ist.

Ist eigentlich ein sehr übliches Pattern, wenn man dynamisch unterschiedlichen Code haben will - also so ziemlich immer ;)
Es gibt auch noch andere Patterns (z.B. Strategy), die sehr ähnlich sind, aber das Ziel sich in gewisser Weise unterscheidet.

1

Harte Kost für einen Anfänger....

Palladin007 hat ja schon einige dazu geschrieben. C# hat Default keine Eval-Funktion und benötigt Spezielle Bibliotheken welche in einem String gespeicherten Quellcode zur Laufzeit kompilieren können. https://stackoverflow.com/questions/4629/how-can-i-evaluate-c-sharp-code-dynamically

Die dynamische Ausführung von Quellcode (Evalute) stellt ein erhebliches Sicherheitsrisiko dar die Eval-/IEX-funktionen von JavaScript /VBScript/Powershell etc. werden sehr kritisch betrachtet und und häufig vom Defender und anderer AVSoftware blockiert.

Eine andere Sache ist beispielsweise die dynamische Eingabe einer Rechenaufgabe, welche gelöst werden soll. Viele Anfänger machen sich die Mühe um einen eigenen Parser zu basteln. Das ist unnötig. ADO.NET bietet standardmäßig Funktionen, welche einer Tabellenkalkulation wie Exel gleichkommen. Für das berechnen einer einfachen in einem String übergebenen Formel genügt die Methode DataTable.Compute(...) .

Hier ein kleiner Kommandozeilenrechner:

SimpleCalc.cs

using System;
using System.Data;
class program
{
    static void Main(string[] args)
    {
        string Formula="";
        if (args.Length == 0)
        {
            Console.WriteLine("Bitte schreibe  deine Formel in die Kommandozeile");
            Console.WriteLine("Hilfe: "+System.AppDomain.CurrentDomain.FriendlyName+"  (3+2)*5");
            Console.WriteLine("Interaktiver Modus, Gib nun deine Rechenaufgabe ein : ");
            Formula=Console.ReadLine();
            try
            {
                 Console.WriteLine(Convert.ToDouble(new DataTable().Compute(Formula,"")));
            }
            catch {Console.WriteLine("Keine zulässige Formel");}
            Console.ReadLine();
        }
        else
        {
            for (int i = 0; i < args.Length; i++)
            {
                Formula += args[i]; //alle Kommandozeilenargumente  zu  einen String zusammenfassen
            }
            try
            {
                 Console.WriteLine(Convert.ToDouble(new DataTable().Compute(Formula,"")));
            }
            catch
            {
                Console.WriteLine("Keine zulässige Formel");
            }
        }
    }
}

Ja, ist möglich, gibt nur kein Grund dies zu machen. Hier allerdings ein Link zu einem Quora Thread in dem du ein Code Beispiel findest und auch mehrere Wege das ganze umzusetzen:

https://www.quora.com/Is-there-a-way-to-execute-a-string-of-C-code-from-within-a-C-program

Btw: Das du nichts im Internet gefunden hast kann eigentlich nicht sein, eine einfache Google Suche mit dem Text "C# execute Code from string" hat gereicht um Antworten zu finden.

https://letmegooglethat.com/?q=C%23+execute+code+from+string

Woher ich das weiß:Hobby – Ich interessiere mich für das programmieren und Informatik