C#脚本CSharpScript

网友投稿 1050 2022-10-06

C#脚本CSharpScript

C#脚本CSharpScript

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

然后搜索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("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(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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序 es6-promise.js封装请求与处理异步进程(微信小程序怎么弄出来)
下一篇:微信小程序实现折叠与展开文章功能(微信折叠长文字)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~