In some cases, you need to dynamically execute C#code during program execution. For example, you need to save certain algorithms that change frequently in a configuration file, and read and perform operations from the configuration file during execution. At this point, you can use C#scripts to do this.
使用 C#脚本需要引用库Microsoft.CodeAnalysis.CSharp.Scripting,下面是一些示例:
The most basic usage is to calculate arithmetic expressions:
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);
String functions can be called directly:
Console.WriteLine(@"测试字符串函数:""Hello"".Length");
res = await CSharpScript.EvaluateAsync(@"""Hello"".Length");
Console.WriteLine(res);
如果需要传递变量,可以将类的实例作为上下文进行传递,下面的例子中使用了Student类:
Console.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;
}
Reused scripts can be reused:
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);
Functions can also be defined in scripts:
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);
Variables can also be defined in scripts:
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);
The complete example can be downloaded from github: github.com/zhenl/CSharpScriptDemo
This article comes from the Blog Park. Author: Looking for nameless qualities. Please indicate the original link to reprint it: www.cnblogs.com/zhenl/p/15714453.html