2017-05-25 62 views
0

我试图使一个从一些脚本语言到C#的小型解释器,我需要执行写入字符串变量的C#方法,我想执行该操作。那可能吗?如果是的话......我该如何做到这一点?C#执行从字符串创建的函数

我对最终的功能函数会是这个样子:

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); 
     } 
    } 

Script代码:

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

凡WaitForSeconds是Unity3D功能和TurnOnLed(真)这是我的。 当我在互联网上搜索时,我喜欢一些解决方案,我将创建一个能够运行此方法的整个类......是其他解决方案吗?

是否有任何简单的方法来做到这一点?

+0

您的脚本语言解析器是什么样的? –

+0

@FelixGuo我已经添加了这个问题,这是一种Python – Mircea

+0

也许这将帮助你:https://stackoverflow.com/questions/4181668/execute-c-sharp-code-at-runtime-from-code-文件 – MetaColon

回答

1

你真的必须创建完整的类才能运行生成的C#代码。您可以随时换的代码片段插入类单一的方法来构建一个工人阶级和比编译(编译覆盖Is it possible to dynamically compile and execute C# code fragments?

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

这听起来像你真正想建立代码运行,而非转码将脚本转换为C#,而不是将C#编译为IL,而不是执行IL。相反,您可以直接生成IL或构建Expression树 - 起点Reflection.Emit vs CodeDOM。根据你的脚本样本和要求,不要创建完整的类Expression树会是更好的选择。


另一种选择是使用现有的脚本引擎 - Lua中的JavaScript,Python和许多其他有解析器,让您使用您执行从.net代码的脚本(即How can I call (Iron)Python code from a C# app?

0

鉴于Unity,这是一个便宜而且有点冒险的方法:内置的Unity函数GameObject.SendMessage()允许您使用函数名字符串调用C#函数。下面是从Unity文档相关代码:

public class ExampleClass : MonoBehaviour { 

    void ApplyDamage(float damage) { 
     print(damage); 
    } 

    void Example() { 
     gameObject.SendMessage("ApplyDamage", 5.0F); 
    } 

} 

希望这有助于。