你不必使用csi.exe,你可以在你的應用程序中實際編譯和執行C# (與解決方案對象,類和方法的上下文相關)。
我還沒有找到一些關於它的一些真實文檔,旁邊有一些blog posts。
你應該看看的主要方法是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
(但不包含名稱空間)中聲明自己的類。
如果您希望有一些終端環境(=總是返回一些字符串),請考慮在執行之前操作用戶定義的代碼。
我假設您想要將您的遊戲引擎的至少一些功能暴露給C#腳本? – zneak
@zneak是的。這是我能想到的唯一例子。 – johnny
我對這個問題不夠了解,無法發佈完整的解決方案,但是您可能希望查看'Microsoft.CSharp.CSharpCodeProvider'的方向。 – zneak