【问题标题】:C# execut a function created from stringC# 执行从字符串创建的函数
【发布时间】:2017-10-26 17:32:10
【问题描述】:

我正在尝试从某种脚本语言到 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);
        }
    }

脚本代码:

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

WaitForSeconds 是 Unity3D 函数,而 TurnOnLed(true) 是我的。 当我在互联网上搜索时,我喜欢一些解决方案,我将创建一个完整的类来运行这个方法......还有其他解决方案吗?

有什么简单的方法吗?

【问题讨论】:

标签: c# string unity3d methods


【解决方案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?

【讨论】:

    【解决方案2】:

    鉴于您使用的是 Unity,有一种便宜且略显老套的方法:内置的 Unity 函数 GameObject.SendMessage() 允许您使用函数名称调用 C# 函数细绳。以下是 Unity 文档中的相关代码:

    public class ExampleClass : MonoBehaviour {
    
        void ApplyDamage(float damage) {
            print(damage);
        }
    
        void Example() {
            gameObject.SendMessage("ApplyDamage", 5.0F);
        }
    
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 2016-09-07
      • 2019-03-20
      • 2023-04-09
      • 2022-01-24
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多