场景
想找一个支持跨平台的dotnet脚本代码引擎。
总结
- 增加CSharpScript后,windows/linux平台的编译包会增大20MB;
- 编译后的单文件模式,在windows/linux无法运行,原因未知(猜测和Roslyn需要本地有SDK有关);
- 遂放弃使用;
测试代码
// See https://aka.ms/new-console-template for more information
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
Console.WriteLine("Hello, World!");
var result = await CSharpScript.EvaluateAsync("1 + 2");
Console.WriteLine(result); // 输出 3
var state = await CSharpScript.RunAsync("int x = 1;");
state = await state.ContinueWithAsync("int y = 2;");
state = await state.ContinueWithAsync("x + y");
Console.WriteLine(state.ReturnValue); // 输出 3
var options = ScriptOptions.Default
.WithReferences(typeof(DateTime).Assembly)
.WithImports("System");
var result2 = await CSharpScript.EvaluateAsync<DateTime>(
"DateTime.Now.AddDays(1)",
options);
Console.WriteLine(result2.ToString()); // 输出 3
try
{
var result5 = await CSharpScript.EvaluateAsync("1 + ");
}
catch (CompilationErrorException e)
{
Console.WriteLine(string.Join(Environment.NewLine, e.Diagnostics));
}
var result4 = await CSharpScript.EvaluateAsync<string>(@"
int day = 3;
switch (day)
{
case 1: return ""Monday"";
case 2: return ""Tuesday"";
case 3: return ""Wednesday"";
default: return ""Invalid day"";
}
");
Console.WriteLine(result4); // 输出 "Wednesday"
var result6 = await CSharpScript.EvaluateAsync<int>(@"
int x = 10;
if (x > 5)
{
return x * 2;
}
else
{
return x / 2;
}
");
Console.WriteLine(result6); // 输出 20
Console.ReadLine();