如何将c#脚本API (csi.exe)与宿主程序集成

本文关键字:exe 宿主 集成 主程序 csi 脚本 API | 更新日期: 2023-09-27 18:09:27

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

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

如何将c#脚本API (csi.exe)与宿主程序集成

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

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

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

查看CSharpScript.RunAsyncCSharpScript.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中声明您自己的类(但没有名称空间)。

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

要从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中。您可以通过

访问参数。
Args[0] ... Args[n]