2023年愚公系列CS-Script脚本执行引擎案例,如何应用于.NET CORE工具?

2026-03-30 15:241阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1156个文字,预计阅读时间需要5分钟。

2023年愚公系列CS-Script脚本执行引擎案例,如何应用于.NET CORE工具?

(文章目录)+ 前言 + 运行

(文章目录)


前言

运行C#脚本的解决方案,有Roslyn和Mono。CS-Script主要是基于Roslyn封装实现的,并且提供了一些额外功能:

  • 执行完整的C#文件
  • 通过外部进程执行C#文件
  • 在运行过程中链接多个C#文件,并集成运行
  • 提供简便的方法进行链接
  • 脚本调试功能

CS-Script功能相关概念:

  • CS-Script 是一个基于 CLR 的脚本系统,它使用符合 ECMA 的 C# 作为编程语言。
  • CS-Script 是最成熟的 C# 脚本解决方案之一。它于 2004 年公开可用,距 .NET 首次发布仅两年。它是第一个适用于.NET 的综合脚本平台。
  • CS-Script 支持托管和独立 (CLI) 执行模型。这样就可以将脚本引擎用作 PowerShell 的纯C#替代方案。以及使用托管脚本引擎在运行时执行的 C# 脚本扩展 .NET 应用程序。
  • CS-Script 允许在不影响代码库的情况下无缝切换底层编译技术。目前支持的编译器是dotnet.exe和csc.exe。
  • CS-Script 还提供与大多数常见开发工具的全面集成:vs和vscode等IDE。
  • CS-Script 它可以在Win和Linux上运行

CS-Script官网:github.com/oleg-shilo/cs-script

一、CS-Script脚本执行引擎

1.安装包

Install-Package CS-Script

CS-Script实际上底层支持Mono/Roslyn/CodeDom三种脚本引擎,由于.NET CORE的特殊性,CS-Script.Core做了删减,只能支持Roslyn一种引擎了,支持的C#语言版本由Roslyn版本决定。

2.具体使用

2.1 CompileMethod

编译方法,并返回动态生成的程序集,方法被默认加载到DynamicClass类中,该Type完全限定名称为css_root+DynamicClass,定义的静态方法需要使用以下方式调用。

//1.-------------------------------编译方法:执行cs程序------------------------------- Assembly compilemethod = CSScript.RoslynEvaluator.CompileMethod( @"using System; public static void CompileMethod(string greeting) { Console.WriteLine(""CompileMethod:"" + greeting); }"); var p = compilemethod.GetType("css_root+DynamicClass"); var me = p.GetMethod("CompileMethod"); me.Invoke(null, new object[] { "1" });

2.2 LoadMethod

加载方法,并返回默认类(DynamicClass)的一个对象,通过定义返回对象为dynamic类型,可以直接调用实例方法。

2023年愚公系列CS-Script脚本执行引擎案例,如何应用于.NET CORE工具?

//2.-------------------------------加载方法:执行cs程序------------------------------- //eval = CSScript.Evaluator.ReferenceAssembly(sqr); dynamic loadmethod = CSScript.Evaluator.LoadMethod( @"using System; public void LoadMethod(string greeting) { Console.WriteLine(""LoadMethod:"" +greeting); }"); loadmethod.LoadMethod("Hello World!");

2.3 LoadCode

加载类,并返回代码段中的第一个类的实例,通过定义返回对象为dynamic类型,可以直接调用实例方法。

//3.-------------------------------加载类:方法执行cs程序------------------------------- dynamic loadcode = CSScript.Evaluator .LoadCode(@"using System; using System.Text; public class ScriptCC { public void LoadCode(string greeting) { Console.WriteLine(""LoadCode:"" + greeting); } }"); loadcode.LoadCode("111");

2.4 CompileCode

编译类,并返回动态生成的程序集,定义的实例方法可以使用以下方式调用。

//4.-------------------------------编译类:方法执行cs程序------------------------------- var eval = CSScript.Evaluator.ReferenceDomainAssemblies(DomainAssemblies.AllStaticNonGAC); var ass = eval .CompileCode(@"using System; public static class ScriptCCStatic { public static void LoadCodeStatic(string greeting) { Console.WriteLine(""LoadCodeStatic:"" + greeting); } }"); var p1 = ass.GetType("css_root+ScriptCCStatic"); var me1 = p1.GetMethod("LoadCodeStatic"); me1.Invoke(null, new object[] { "1" });

//6.-------------------------------生成实例:方法执行cs程序------------------------------- Assembly compilecode = eval .CompileCode(@"using System; using System.Text; public class ScriptLC { public void CompileCode(string greeting) { Console.WriteLine(""CompileCode:"" + greeting + Encoding.ASCII.IsBrowserDisplay); } }"); var ps = compilecode.GetType("css_root+ScriptLC"); var obj = compilecode.CreateInstance("css_root+ScriptLC"); var mes = ps.GetMethod("CompileCode"); mes.Invoke(obj, new object[] { "1" }); Console.WriteLine();

2.5 CreateDelegate

生成一个委托,同样定义在DynamicClass中,可以直接调用。

//5.-------------------------------生成委托:方法执行cs程序------------------------------- var tp = eval.CreateDelegate(@"int Sqr(int a) { return a * a; }"); Console.WriteLine(tp(3));

2.6 其他说明

//---------------------------------------查看evaluator的引用程序集------------------------- var ww = eval.GetReferencedAssemblies(); foreach (var n in ww) { if (n.GetName().Name.Contains("System")) continue; if (n.GetName().Name.Contains("Microsoft")) continue; if (n.GetName().Name.Contains("CS")) continue; Console.WriteLine("AseemblyName: " + n.GetName()); foreach (var wn in n.GetTypes()) { Console.WriteLine("Types: " + wn.Name); } } Console.WriteLine(); //--------------------------------------查看当前AppDomain加载的程序集----------------------- foreach (var n in AppDomain.CurrentDomain.GetAssemblies()) { if (n.GetName().Name.Contains("System")) continue; if (n.GetName().Name.Contains("Microsoft")) continue; if (n.GetName().Name.Contains("CS")) continue; Console.WriteLine("AseemblyName: " + n.GetName()); foreach (var wn in n.GetTypes()) { Console.WriteLine("Types: " + wn.Name); } } Console.ReadKey();

本文共计1156个文字,预计阅读时间需要5分钟。

2023年愚公系列CS-Script脚本执行引擎案例,如何应用于.NET CORE工具?

(文章目录)+ 前言 + 运行

(文章目录)


前言

运行C#脚本的解决方案,有Roslyn和Mono。CS-Script主要是基于Roslyn封装实现的,并且提供了一些额外功能:

  • 执行完整的C#文件
  • 通过外部进程执行C#文件
  • 在运行过程中链接多个C#文件,并集成运行
  • 提供简便的方法进行链接
  • 脚本调试功能

CS-Script功能相关概念:

  • CS-Script 是一个基于 CLR 的脚本系统,它使用符合 ECMA 的 C# 作为编程语言。
  • CS-Script 是最成熟的 C# 脚本解决方案之一。它于 2004 年公开可用,距 .NET 首次发布仅两年。它是第一个适用于.NET 的综合脚本平台。
  • CS-Script 支持托管和独立 (CLI) 执行模型。这样就可以将脚本引擎用作 PowerShell 的纯C#替代方案。以及使用托管脚本引擎在运行时执行的 C# 脚本扩展 .NET 应用程序。
  • CS-Script 允许在不影响代码库的情况下无缝切换底层编译技术。目前支持的编译器是dotnet.exe和csc.exe。
  • CS-Script 还提供与大多数常见开发工具的全面集成:vs和vscode等IDE。
  • CS-Script 它可以在Win和Linux上运行

CS-Script官网:github.com/oleg-shilo/cs-script

一、CS-Script脚本执行引擎

1.安装包

Install-Package CS-Script

CS-Script实际上底层支持Mono/Roslyn/CodeDom三种脚本引擎,由于.NET CORE的特殊性,CS-Script.Core做了删减,只能支持Roslyn一种引擎了,支持的C#语言版本由Roslyn版本决定。

2.具体使用

2.1 CompileMethod

编译方法,并返回动态生成的程序集,方法被默认加载到DynamicClass类中,该Type完全限定名称为css_root+DynamicClass,定义的静态方法需要使用以下方式调用。

//1.-------------------------------编译方法:执行cs程序------------------------------- Assembly compilemethod = CSScript.RoslynEvaluator.CompileMethod( @"using System; public static void CompileMethod(string greeting) { Console.WriteLine(""CompileMethod:"" + greeting); }"); var p = compilemethod.GetType("css_root+DynamicClass"); var me = p.GetMethod("CompileMethod"); me.Invoke(null, new object[] { "1" });

2.2 LoadMethod

加载方法,并返回默认类(DynamicClass)的一个对象,通过定义返回对象为dynamic类型,可以直接调用实例方法。

2023年愚公系列CS-Script脚本执行引擎案例,如何应用于.NET CORE工具?

//2.-------------------------------加载方法:执行cs程序------------------------------- //eval = CSScript.Evaluator.ReferenceAssembly(sqr); dynamic loadmethod = CSScript.Evaluator.LoadMethod( @"using System; public void LoadMethod(string greeting) { Console.WriteLine(""LoadMethod:"" +greeting); }"); loadmethod.LoadMethod("Hello World!");

2.3 LoadCode

加载类,并返回代码段中的第一个类的实例,通过定义返回对象为dynamic类型,可以直接调用实例方法。

//3.-------------------------------加载类:方法执行cs程序------------------------------- dynamic loadcode = CSScript.Evaluator .LoadCode(@"using System; using System.Text; public class ScriptCC { public void LoadCode(string greeting) { Console.WriteLine(""LoadCode:"" + greeting); } }"); loadcode.LoadCode("111");

2.4 CompileCode

编译类,并返回动态生成的程序集,定义的实例方法可以使用以下方式调用。

//4.-------------------------------编译类:方法执行cs程序------------------------------- var eval = CSScript.Evaluator.ReferenceDomainAssemblies(DomainAssemblies.AllStaticNonGAC); var ass = eval .CompileCode(@"using System; public static class ScriptCCStatic { public static void LoadCodeStatic(string greeting) { Console.WriteLine(""LoadCodeStatic:"" + greeting); } }"); var p1 = ass.GetType("css_root+ScriptCCStatic"); var me1 = p1.GetMethod("LoadCodeStatic"); me1.Invoke(null, new object[] { "1" });

//6.-------------------------------生成实例:方法执行cs程序------------------------------- Assembly compilecode = eval .CompileCode(@"using System; using System.Text; public class ScriptLC { public void CompileCode(string greeting) { Console.WriteLine(""CompileCode:"" + greeting + Encoding.ASCII.IsBrowserDisplay); } }"); var ps = compilecode.GetType("css_root+ScriptLC"); var obj = compilecode.CreateInstance("css_root+ScriptLC"); var mes = ps.GetMethod("CompileCode"); mes.Invoke(obj, new object[] { "1" }); Console.WriteLine();

2.5 CreateDelegate

生成一个委托,同样定义在DynamicClass中,可以直接调用。

//5.-------------------------------生成委托:方法执行cs程序------------------------------- var tp = eval.CreateDelegate(@"int Sqr(int a) { return a * a; }"); Console.WriteLine(tp(3));

2.6 其他说明

//---------------------------------------查看evaluator的引用程序集------------------------- var ww = eval.GetReferencedAssemblies(); foreach (var n in ww) { if (n.GetName().Name.Contains("System")) continue; if (n.GetName().Name.Contains("Microsoft")) continue; if (n.GetName().Name.Contains("CS")) continue; Console.WriteLine("AseemblyName: " + n.GetName()); foreach (var wn in n.GetTypes()) { Console.WriteLine("Types: " + wn.Name); } } Console.WriteLine(); //--------------------------------------查看当前AppDomain加载的程序集----------------------- foreach (var n in AppDomain.CurrentDomain.GetAssemblies()) { if (n.GetName().Name.Contains("System")) continue; if (n.GetName().Name.Contains("Microsoft")) continue; if (n.GetName().Name.Contains("CS")) continue; Console.WriteLine("AseemblyName: " + n.GetName()); foreach (var wn in n.GetTypes()) { Console.WriteLine("Types: " + wn.Name); } } Console.ReadKey();