C# Code aus String etc. einfügen?
Ich schreibe ein Programm bei dem der Code in Strings stehen soll. Und wenn das passiert, dann soll der Code aus diesem String genommen werden.
Jetzt frag ich mich, ob dass funktioniert und wenn wie? Im Internet hab ich nichts gefunden.
Weiß jemand wie?
Danke im Vorraus.
Was für ein Code? Was heißt "aus dem String nehmen"?
Also zum Beispiel console.writeline(„Test1“)
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.
Ja meinte ich
3 Antworten
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.
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.
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.
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
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.
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
Ja, ich bin noch relativer Anfänger. Ich hab einen anderen Weg gefunden. Dieser wäre nur unkomplizierter und übersichtlicher gewesen