如何将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#脚本。
你不必使用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;
}
在本例中,您输入的代码必须返回一个字符串(需要以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]