2017-05-25 1 views
0

Ich versuche, wie ein kleiner Interpreter aus einer Skriptsprache zu C# zu machen, und ich muss eine C# -Methode ausführen, die in einer String-Variablen geschrieben ist, und ich möchte das ausführen. Ist das möglich? Und wenn ja ... wie genau kann ich das machen?C# execut eine Funktion erstellt von String

Meine Funktionen Funktion am Ende wird wie folgt aussehen:

public IEnumerator Blink() 
    { 
     TurnOnLed(true); 
     yield return new WaitForSeconds(2); 
     for (var i = 0; i < 10; ++i) 
     { 
      TurnOnLed(false); 
      yield return new WaitForSeconds(1); 
      TurnOnLed(true); 
      yield return new WaitForSeconds(1); 
     } 
    } 

Code Script:

output(true) 
sleep(2) 
for x in range(10) 
    output(false) 
    sleep(1) 
    output(true) 
    sleep(1) 

Wo WaitForSeconds ist eine Unity3D Funktion und TurnOnLed (true) ist es meins. Wenn ich im Internet suche, habe ich einige Lösungen, wo ich eine ganze Klasse erstellen werde, um dieses Methon ausführen zu können ... ist eine andere Lösung?

Gibt es einen einfachen Weg, dies zu tun?

+0

Wie sieht Ihr Skriptsprache-Parser aus? –

+0

@FelixGuo Ich habe dies auf Frage hinzufügen, es ist eine Art Python – Mircea

+0

Vielleicht wird Ihnen das helfen: https://stackoverflow.com/questions/4181668/execute-c-sharp-code-at-runtime-from-code- Datei – MetaColon

Antwort

1

Sie müssen wirklich vollständige Klassen erstellen, um den resultierenden C# -Code ausführen zu können. Sie können immer Codefragment in der Klasse mit einzelnen Verfahren wickeln eine Arbeiterklasse zu konstruieren, und als es kompilieren

var myCode = "Console.WriteLine(\"!!!\")"; 
var classFormat = "class Fake{0} {{ public void Do(){{ {1} ;}} }}"; 
var finalCode = String.Format(classFormat, 123, myCode); 

Es klingt wie Sie tatsächlich Code auszuführen bauen wollen, anstatt Transcodierungs (in Is it possible to dynamically compile and execute C# code fragments? bedeckt zusammenstellen) Ihr Skript in C#, als C# in IL zu kompilieren und dann IL auszuführen. Stattdessen können Sie IL direkt generieren oder Expression Baum - Startpunkte Reflection.Emit vs CodeDOM konstruieren. Basierend auf Ihrem Skriptbeispiel und der Anforderung, keine vollständigen Klassen zu erstellen, wäre Expression Baum die bessere Option.


Eine weitere Option ist es, bestehende Skriptmodule zu verwenden - Lua, JavaScript, Python und viele andere Parser haben, die es Ihnen ermöglichen, Skripte von .NET-Code (dh How can I call (Iron)Python code from a C# app?)

0

Da auszuführen, dass Sie verwenden Unity, es gibt einen billigen und etwas hacky Weg, dies zu tun: Die integrierte Unity-Funktion GameObject.SendMessage() ermöglicht es Ihnen, C# -Funktionen mit dem Funktionsnamen String aufzurufen. Hier ist der relevante Code aus der Unity-Dokumentation:

Hoffe das hilft.

Verwandte Themen