AScript - C#轻量级动态脚本引擎
一、简介
AScript 是一个基于 C# 的动态脚本解析、编译与执行引擎。它支持C# 语法,可以让应用程序在不重新编译的情况下动态执行用户自定义的脚本逻辑。
开源地址:https://gitee.com/rockey627/ascript
二、核心特性
语法支持
- C# 基本语法:变量、运算符、表达式
- 控制流:if/else、for、while、foreach、continue、break、return
- 函数:支持自定义函数、函数重载、递归调用
- 字符串内插:
$'hello {name}' - 十六进制整数:
0x0A - 行注释与块注释
执行模式
- 解析执行:即时解析计算
- 编译执行:编译成委托再执行,可缓存编译结果再执行
多层级上下文
- 支持创建子上下文
- 子上下文可继承访问父上下文中的定义,实现逻辑复用
- 适用于多支线脚本执行、函数调用隔离等场景
- 顶级上下文:ScriptContext.Root,可全局设置变量、函数等
宿主集成
- 注入变量、函数、类型
- 自定义语法解析(关键字扩展)
- 流式读取脚本
三、快速开始
1 // NuGet: Install-Package AScript 2 using AScript;
3 var script = new Script(); 4 var result = script.Eval("5+8*6"); // 53 5 6 // 定义函数 7 string code = @" 8 int sum(int a, int b)=>a+b; 9 int n=10; 10 sum(n,5)"; 11 var result = script.Eval(code); // 15
四、应用场景
1. 规则引擎
将业务规则以脚本形式存储,运行时动态加载执行,无需发版即可调整规则逻辑。
1 string filePath = @"./rule.txt"; 2 // 缓存时间,-1表示永久缓存,0表示不缓存,大于0表示缓存时间(毫秒) 3 int cacheTime = -1; 4 // 文件路径作为缓存key 5 string cacheKey = filePath; 6 // 文件修改时间作为版本号(或者计算文件md5作为版本号) 7 string cacheVersion = File.GetLastWriteTime(filePath).ToFileTimeUtc().ToString(); 8 // 如果文件未改动,则从缓存中执行,否则重新读取->解析->编译->缓存->执行 9 var script = new Script(); 10 script.Eval(() => File.OpenRead(filePath), cacheTime, cacheKey, cacheVersion);
2. 公式计算器
让用户自定义计算公式,系统负责解析执行,如财务模板、绩效计算等场景。
3. 游戏脚本系统
为游戏提供轻量级脚本支持,玩家可编写脚本实现自动任务、宏命令等功能。
4. 插件扩展机制
允许第三方编写脚本扩展程序功能,沙箱执行保障安全性。
5. 多支线执行
基于多层级上下文,支线间数据互不干扰,同时共享父级公共逻辑。
1 var rootContext = new ScriptContext(); 2 rootContext.SetVar("n", 8); 3 rootContext.AddFunc<int, int, int>("sum", (a, b) => a + b); 4 5 // 支线1 6 var context1 = new ScriptContext(rootContext); 7 context1.SetVar("x", 100); 8 var script1 = new Script(context1); 9 var result1 = script1.Eval("sum(x, n)"); 10 Console.WriteLine(result1); // 108 11 12 // 支线2 13 var context2 = new ScriptContext(rootContext); 14 context2.SetVar("y", 50); 15 var script2 = new Script(context2); 16 var result2 = script2.Eval("sum(y, n)"); 17 Console.WriteLine(result2); // 58
五、结语
AScript 体积小巧、接口简洁,适合需要嵌入脚本能力的 .NET 应用。多层级上下文设计让它在多支线并行执行场景中也能游刃有余。如果您正在寻找一款轻量、高效、易集成的动态脚本引擎,不妨一试。

浙公网安备 33010602011771号