如何将C#脚本API(csi.exe)与主机程序集成?

如何将C#脚本API(csi.exe)与主机程序集成?,c#,csi,C#,Csi,为了简单起见,如果我有一个游戏引擎。使用C#编译。如何使用csi.exe(或其他方法)调用C#脚本。如何在Lua等其他程序中使用C#脚本API 编辑:澄清。我不想从Lua调用C#的csi.exe。我想从编译程序调用CSI.EXE,无论是C(编译的C语言程序)、C++还是别的什么。我并不是说听起来像是从Lua调用脚本API。我的意思是像其他程序一样使用Lua。这就是我想使用C#脚本API的方式。我最感兴趣的是如何从编译的C程序调用C脚本。要从lua调用csi.exe,您可以使用 os.execut

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


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

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

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

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

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

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

查看
CSharpScript.RunAsync
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;
    }
private async void CompileAndExecuteLine(字符串用户代码)
{
字符串输出=”;
ScriptOptions ScriptOptions=ScriptOptions.Default.WithReferences(typeof(MyClass.Assembly));
尝试
{
output=await CSharpScript.evaluateSync(用户代码、脚本选项);
}
捕获(编译错误异常cee)
{
string message=“出现错误:”+“\r\n”;
foreach(cee诊断中的诊断直径)
{
message+=dia.ToString()+“\r\n”;
}
Show(消息,“编译错误”);
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
返回输出;
}
在本例中,您输入的代码必须返回字符串(需要以
returnsomestring;
结尾),您可以从引用的程序集中调用任何类和方法,甚至可以在
userCode
中声明您自己的类(但没有名称空间)


如果您希望有一些终端环境(=总是返回一些字符串),请考虑在执行之前对用户定义的代码进行操作。p> 我假设你想向C#脚本公开至少一些游戏引擎的功能?@zneak是的。这是我能想到的唯一一个例子。我对这件事的了解还不足以发布一个完整的解决方案,但你可能想看看

Microsoft.CSharp.CSharpCodeProvider
。我可能没有解释过,但我想从编译过的程序调用c#的csi.exe,可能是另一个c#编译程序,或者C++或者别的什么。我不想从卢阿打电话给csi。Lua是其他引擎的一个例子。根据你的新信息,我只能说它将依赖于语言。在C#应用程序中,您可以使用
System.Diagnostics.Process.Start
启动csi.exe。由于csi.exe没有输出流,如果您希望它是交互式的,您可能需要使用文件或共享内存之类的东西。对不起,我的C++已经过时了,我记不起来用这种语言怎么做了。
Args[0] ... Args[n]
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;
    }