为了简单起见,如果我有一个游戏引擎。使用C#编译。如何使用C# (或其他方法)调用csi.exe脚本。如何在另一个程序(如Lua )中使用C#脚本编程接口?
编辑:澄清。我不想从Lua调用C#的csi.exe。我想从编译后的程序调用csi.exe,无论是C# (编译的C#程序)、C++还是其他什么东西。我的意思不是像从Lua调用脚本API。我的意思是像其他程序一样使用Lua。这就是我想使用C#脚本API的方式。我最感兴趣的是如何从编译的C#程序中调用C#脚本。
发布于 2016-09-30 15:53:17
您不必使用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中声明您自己的类(但没有名称空间)。
如果您希望有一些终端环境(=总是返回一些字符串),请考虑在执行之前操纵用户定义的代码。
发布于 2016-09-29 16:47:48
要从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]https://stackoverflow.com/questions/39775568
复制相似问题