您不必使用 csi.exe,您可以在应用程序中实际编译和执行 C#(使用解决方案对象、类和方法的上下文)。
除了一些博客文章之外,我还没有找到一些关于它的真实文档。
您应该查看的主要方法在Microsoft.CodeAnalysis.CSharp.Scripting
和中Microsoft.CodeAnalysis.Scripting
。
看看CSharpScript.RunAsync
and 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
(但没有命名空间)。
如果您希望有一些终端环境(=总是返回一些字符串),请考虑在执行之前操作用户定义的代码。