2016-09-29 91 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(但不包含名稱空間)中聲明自己的類。

如果您希望有一些終端環境(=總是返回一些字符串),請考慮在執行之前操作用戶定義的代碼。

相關問題