• C#脚本CSharpScript


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

    然后搜索Microsoft.CodeAnalysis.CSharp.Scripting

     然后测试如下代码:

    1. using System;
    2. using Microsoft.CodeAnalysis.CSharp.Scripting;
    3. using Microsoft.CodeAnalysis.Scripting;
    4. namespace ConsoleApp1
    5. {
    6. class Program
    7. {
    8. static void Main(string[] args)
    9. {
    10. string code1 = @"
    11. public class ScriptedClass
    12. {
    13. public string HelloWorld { get; set; }
    14. public ScriptedClass()
    15. {
    16. HelloWorld = ""Hello Roslyn!"";
    17. }
    18. }";
    19. // 通过Run方法和ContinueWityAsync方法分别执行了两段脚本
    20. DateTime date1 = DateTime.Now;
    21. Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
    22. var script1 = CSharpScript.RunAsync(code1).Result;
    23. date1 = DateTime.Now;
    24. Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
    25. var result1 = script1.ContinueWithAsync<string>("new ScriptedClass().HelloWorld").Result;
    26. date1 = DateTime.Now;
    27. Console.WriteLine("时间: " + date1.ToString("yyyy-MM-dd HH:mm:ss:fff"));
    28. Console.WriteLine(result1.ReturnValue);
    29. Console.WriteLine("Hello World!");
    30. Console.ReadKey(true);
    31. }
    32. }
    33. }

    有些情况下,需要在程序运行期间动态执行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 { get; set; }
    4.     public Decimal Weight { get; set; }
    5.     public Decimal BMI { get; set; }
    6.     public string Status { get; set; } = string.Empty;
    7. }


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

    1. Console.WriteLine(@"测试脚本编译复用:");
    2. var scriptBMI = CSharpScript.Create("Weight/Height/Height", globalsType: typeof(Student));
    3. scriptBMI.Compile();
    4.  
    5. 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.  
    4. var result = await CSharpScript.EvaluateAsync<decimal>(script1, globals: student);
    5. 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
     

  • 相关阅读:
    微信支付v2
    零基础学前端(四)重点讲解 CSS:盒子模型、样式选择器、flex布局
    算法学习笔记 - 哈希(Hash)
    Linux安装Nginx详细步骤
    Qt编写的心跳检测客户端程序
    JWT生成与解析/JWT令牌前端存储
    Mysql笔记2
    私有化轻量级持续集成部署方案--02-Nginx网关服务
    Python 让书法作品和 PIL 库来一场美丽的邂逅
    【C++】特殊类的设计(只在堆、栈创建对象,单例对象)
  • 原文地址:https://blog.csdn.net/qq_40732350/article/details/126144501