C#脚本CSharpScript

Posted QtHalcon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<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<Decimal>("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
 

以上是关于C#脚本CSharpScript的主要内容,如果未能解决你的问题,请参考以下文章

Assets资产

Unity3DUnity 脚本 ① ( 创建 C# 脚本 | Visual Studio 2019 中打开 C# 脚本 | 编译 C# 脚本 | 挂载 C# 脚本到游戏物体 | 运行脚本 )

c#脚本中使用c#方法

C# 脚本

通过脚本(C#) Unity5添加组件脚本

C# 脚本语言