当前位置:   article > 正文

一文看懂 C# 脚本_c#脚本

c#脚本

前言

有些情况下,需要在程序运行期间动态执行C#代码,比如,将某些经常改变的算法保存在配置文件中,在运行期间从配置文件中读取并执行运算。这时可以使用C#脚本来完成这些工作。

正文

使用C#脚本需要引用库Microsoft.CodeAnalysis.CSharp.Scripting,下面是一些示例:最基本的用法是计算算数表达式:

  1. Console.Write("测试基本算数表达式:(1+2)*3/4");
  2. var res = await CSharpScript.EvaluateAsync("(1+2)*3/4");
  3. Console.WriteLine(res);

如果需要使用比较复杂的函数,可以使用WithImports引入名称空间:

  1. Console.WriteLine("测试Math函数:Sqrt(2)");
  2. res = await CSharpScript.EvaluateAsync("Sqrt(2)", ScriptOptions.Default.WithImports("System.Math"));
  3. Console.WriteLine(res);

不仅是计算函数,其它函数比如IO,也是可以的:

  1. Console.WriteLine(@"测试输入输出函数:Directory.GetCurrentDirectory()");
  2. res = await CSharpScript.EvaluateAsync("Directory.GetCurrentDirectory()",
  3.      ScriptOptions.Default.WithImports("System.IO"));
  4. Console.WriteLine(res);

字符串函数可以直接调用:

  1. Console.WriteLine(@"测试字符串函数:""Hello"".Length");
  2. res = await CSharpScript.EvaluateAsync(@"""Hello"".Length");
  3. Console.WriteLine(res);

如果需要传递变量,可以将类的实例作为上下文进行传递,下面的例子中使用了Student类:

  1. Console.WriteLine(@"测试变量:");
  2. var student = new Student { Height = 1.75M, Weight = 75 };
  3. await CSharpScript.RunAsync("BMI=Weight/Height/Height", globals: student);
  4. Console.WriteLine(student.BMI);

类Student:

  1. public class Student
  2. {
  3.     public Decimal Height { getset; }
  4.     public Decimal Weight { getset; }
  5.     public Decimal BMI { getset; }
  6.     public string Status { getset; } = string.Empty;
  7. }

重复使用的脚本可以复用:

  1. Console.WriteLine(@"测试脚本编译复用:");
  2. var scriptBMI = CSharpScript.Create<Decimal>("Weight/Height/Height", globalsType: typeof(Student));
  3. scriptBMI.Compile();
  4. Console.WriteLine((await scriptBMI.RunAsync(new Student { Height = 1.72M, Weight = 65 })).ReturnValue);

在脚本中也可以定义函数:

  1. Console.WriteLine(@"测试脚本中定义函数:");
  2. string script1 = "decimal Bmi(decimal w,decimal h) { return w/h/h; } return Bmi(Weight,Height);";
  3. var result = await CSharpScript.EvaluateAsync<decimal>(script1, globals: student);
  4. Console.WriteLine(result);

在脚本中也可以定义变量:

  1. Console.WriteLine(@"测试脚本中的变量:");
  2. var script =  CSharpScript.Create("int x=1;");
  3. script =  script.ContinueWith("int y=1;");
  4. script =  script.ContinueWith("return x+y;");
  5. Console.WriteLine((await script.RunAsync()).ReturnValue);

完整的实例可以从github下载:https://github.com/zhenl/CSharpScriptDemo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/108349
推荐阅读
相关标签
  

闽ICP备14008679号