新建一个工程,再打开包管理器

然后搜索Microsoft.CodeAnalysis.CSharp.Scripting

然后测试如下代码:
- using System;
- using Microsoft.CodeAnalysis.CSharp.Scripting;
- using Microsoft.CodeAnalysis.Scripting;
- namespace ConsoleApp1
- {
- class Program
- {
- static void Main(string[] args)
- {
- string code1 = @"
- public class ScriptedClass
- {
- public string HelloWorld { get; set; }
- public ScriptedClass()
- {
- HelloWorld = ""Hello Roslyn!"";
- }
- }";
- // 通过Run方法和ContinueWityAsync方法分别执行了两段脚本
- DateTime date1 = DateTime.Now;
- Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
- var script1 = CSharpScript.RunAsync(code1).Result;
- date1 = DateTime.Now;
- Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
- var result1 = script1.ContinueWithAsync<string>("new ScriptedClass().HelloWorld").Result;
- date1 = DateTime.Now;
- Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
- Console.WriteLine(result1.ReturnValue);
- Console.WriteLine("Hello World!");
- Console.ReadKey(true);
- }
- }
- }
有些情况下,需要在程序运行期间动态执行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(@"测试变量:");
- 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
("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下载:https://github.com/zhenl/CSharpScriptDemo