1

为了简单起见,如果我有一个游戏引擎。使用 C# 编译。我将如何使用 csi.exe(或其他方法)调用 C#脚本。如何在 Lua 等其他程序中使用 C# Scripting API?

编辑:澄清。我不想从 Lua 调用 C# 的 csi.exe。我想从已编译的程序中调用 csi.exe,无论是 C#(已编译的 C# 程序)、C++ 还是其他程序。我并不是说这听起来像是从 Lua 调用脚本 API。我的意思是像其他程序一样使用 Lua。这就是我想使用 C# Scripting API 的方式。我最感兴趣的是如何从已编译的 C# 程序中调用 C# 脚本。

4

2 回答 2

1

您不必使用 csi.exe,您可以在应用程序中实际编译和执行 C#(使用解决方案对象、类和方法的上下文)。

除了一些博客文章之外,我还没有找到一些关于它的真实文档。

您应该查看的主要方法在Microsoft.CodeAnalysis.CSharp.Scripting和中Microsoft.CodeAnalysis.Scripting

看看CSharpScript.RunAsyncand CSharpScript.EvaluteAsync,这两个将编译并执行给定的 C# 脚本,其语法类似于 csi.exe 语法。

例如,如果您希望用户输入一些代码并期望此代码在将用户暴露给MyClass程序集时返回一些字符串:

private async void CompileAndExecuteLine(string userCode)
    {
        string output = "";
        ScriptOptions scriptOptions = ScriptOptions.Default.WithReferences(typeof(MyClass).Assembly);

        try
        {
            output = await CSharpScript.EvaluateAsync<string>(userCode, scriptOptions);
        }
        catch (CompilationErrorException cee)
        {
            string message = "You got errors:" + "\r\n";
            foreach (Diagnostic dia in cee.Diagnostics)
            {
                message += dia.ToString() + "\r\n";
            }
            MessageBox.Show(message, "Compilation Error");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }

        return output;
    }

在此示例中,您输入的代码必须返回一个字符串(需要以 结尾return someString;),您可以从引用的程序集中调用任何类和方法,甚至可以在其中声明您自己的类userCode(但没有命名空间)。

如果您希望有一些终端环境(=总是返回一些字符串),请考虑在执行之前操作用户定义的代码。

于 2016-09-30T15:53:17.137 回答
0

要从 lua 调用 csi.exe,您可以使用

os.execute("c:\\<csi.exe location>\csi.exe myscript.csx")

如果您需要传递输入参数,那么

os.execute("c:\\<csi.exe location>\csi.exe myscript.csx myArg")

在您的 myscript.csx 文件中,您可以通过以下方式访问参数

Args[0] ... Args[n]
于 2016-09-29T16:47:48.560 回答