C#脚本
有些情况下,需要在程序运⾏期间动态执⾏C#代码,⽐如,将某些经常改变的算法保存在配置⽂件中,在运⾏期间从配置⽂件中读取并执⾏运算。这时可以使⽤C#脚本来完成这些⼯作。
使⽤C#脚本需要引⽤库Microsoft.CodeAnalysis.CSharp.Scripting,下⾯是⼀些⽰例:
最基本的⽤法是计算算数表达式:
Console.Write("测试基本算数表达式:(1+2)*3/4");
var res = await CSharpScript.EvaluateAsync("(1+2)*3/4");
Console.WriteLine(res);
如果需要使⽤⽐较复杂的函数,可以使⽤WithImports引⼊名称空间:
Console.WriteLine("测试Math函数:Sqrt(2)");
res = await CSharpScript.EvaluateAsync("Sqrt(2)", ScriptOptions.Default.WithImports("System.Math"));
Console.WriteLine(res);
不仅是计算函数,其它函数⽐如IO,也是可以的:
Console.WriteLine(@"测试输⼊输出函数:Directory.GetCurrentDirectory()");
res = await CSharpScript.EvaluateAsync("Directory.GetCurrentDirectory()",
ScriptOptions.Default.WithImports("System.IO"));
Console.WriteLine(res);
字符串函数可以直接调⽤:
Console.WriteLine(@"测试字符串函数:""Hello"".Length");
res = await CSharpScript.EvaluateAsync(@"""Hello"".Length");
Console.WriteLine(res);
如果需要传递变量,可以将类的实例作为上下⽂进⾏传递,下⾯的例⼦中使⽤了Student类:
Console.WriteLine(@"测试变量:");
writeline函数
var student = new Student { Height = 1.75M, Weight = 75 };
await CSharpScript.RunAsync("BMI=Weight/Height/Height", globals: student);
Console.WriteLine(student.BMI);
类Student:
public class Student
{
public Decimal Height { get; set; }
public Decimal Weight { get; set; }
public Decimal BMI { get; set; }
public string Status { get; set; } = string.Empty;
}
重复使⽤的脚本可以复⽤:
Console.WriteLine(@"测试脚本编译复⽤:");
var scriptBMI = CSharpScript.Create<Decimal>("Weight/Height/Height", globalsType: typeof(Student));
scriptBMI.Compile();
Console.WriteLine((await scriptBMI.RunAsync(new Student { Height = 1.72M, Weight = 65 })).ReturnValue);
在脚本中也可以定义函数:
Console.WriteLine(@"测试脚本中定义函数:");
string script1 = "decimal Bmi(decimal w,decimal h) { return w/h/h; } return Bmi(Weight,Height);";
var result = await CSharpScript.EvaluateAsync<decimal>(script1, globals: student);
Console.WriteLine(result);
在脚本中也可以定义变量:
Console.WriteLine(@"测试脚本中的变量:");
var script =  CSharpScript.Create("int x=1;");
script =  script.ContinueWith("int y=1;");
script =  script.ContinueWith("return x+y;");
Console.WriteLine((await script.RunAsync()).ReturnValue);
完整的实例可以从github下载:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。