2016-09-29 44 views
0

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

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

+0

我假设您想要将您的游戏引擎的至少一些功能暴露给C#脚本? – zneak

+0

@zneak是的。这是我能想到的唯一例子。 – johnny

+0

我对这个问题不够了解,无法发布完整的解决方案,但是您可能希望查看'Microsoft.CSharp.CSharpCodeProvider'的方向。 – zneak

回答

0

调入csi.exe从Lua,如果你需要通过输入参数,然后

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

里面你myscript.csx文件,您可以通过访问这些参数你会使用

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

Args[0] ... Args[n] 
+0

我可能没有解释它,但我想从编译的东西中调用c#的csi.exe,可能是另一个c#编译的程序,或C++或其他东西。我不想从卢阿打电话给csi。 Lua就是用其他引擎完成的例子。 – johnny

+0

有了你的新信息,我只能说它会依赖于语言。在C#应用程序中,您可以使用System.Diagnostics.Process.Start来启动csi.exe。由于csi.exe没有输出流,如果你希望它是交互式的,你可能不得不使用类似文件或共享内存的东西。对不起,我的C++已经过时了,我不记得如何用这种语言来做到这一点。 – phil

0

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

我还没有找到一些关于它的一些真实文档,旁边有一些blog posts

你应该看看的主要方法是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(但不包含名称空间)中声明自己的类。

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

相关问题