跳转到内容

XiHan.Framework.Script

脚本引擎:基于 Roslyn 动态编译并执行 C# 脚本,支持超时控制、编译缓存与安全校验。

  • NuGetXiHan.Framework.Script
  • 模块类XiHanScriptModule
  • 所在层:基础设施层

这是什么

XiHan.Framework.Script 让你在运行时把一段 C# 源码字符串直接编译成程序集并执行,得到强类型结果。底层用 Roslyn(Microsoft.CodeAnalysis.CSharp)在内存中编译,支持表达式求值、语句块、方法、类以及完整程序等多种脚本形态。它还内置了编译缓存、执行超时、安全校验与性能监控,适合做规则计算、动态公式、可配置逻辑这类"代码即配置"的场景。

说明:本包只支持 C#(Roslyn)。源码与依赖中没有 JavaScript / Python 引擎,请勿据此声称支持其它语言。

何时使用

  • 需要在运行期执行用户或配置中提供的 C# 表达式/脚本(如动态规则、计算公式)。
  • 想把可变的业务逻辑外置为脚本,改逻辑无需重新发布。
  • 需要对脚本执行做超时、命名空间/类型黑名单等安全约束。
  • 需要缓存已编译脚本、复用编译结果以提升重复执行性能。

安装

bash
dotnet add package XiHan.Framework.Script

启用

csharp
[DependsOn(typeof(XiHanScriptModule))]
public class MyModule : XiHanModule { }

也可不走模块,直接用静态入口 XiHanScript 或工厂 ScriptEngineFactory 使用(模块类当前不注册额外服务)。

核心能力

  • 动态执行ExecuteAsync / EvaluateAsync 执行脚本或求值表达式,ExecuteFileAsync 执行脚本文件,支持强类型返回 ScriptResult<T>
  • 多种脚本形态ScriptType 支持 Expression / Statement / Method / Class / Program,引擎自动包装为可编译代码。
  • 编译缓存:按脚本内容与选项生成缓存键,命中则复用已编译程序集,附带命中率等统计。
  • 超时控制TimeoutMs 通过 CancellationTokenSource 限制执行时长,超时抛 ScriptTimeoutException
  • 安全校验:编译后对程序集做反射检查,拦截禁止的命名空间/类型、危险关键字与不安全代码;SecurityOptions 提供 Strict / Permissive / Disabled 预设。
  • 构建与监控ScriptEngineBuilder 流式配置引用/导入/全局变量/超时;ScriptMonitorScriptTemplateManager 支持执行监控与脚本模板。

主要类型

类型说明
IScriptEngine / ScriptEngine脚本引擎接口与基于 Roslyn 的实现
XiHanScript静态门面,RunAsync / EvalAsync / RunFileAsync 快速执行
ScriptEngineFactory引擎工厂,创建默认/命名引擎并管理生命周期与统计
ScriptEngineBuilder流式构建器,配置引用、导入、全局变量、超时等
ScriptOptions / CompilerOptions / SecurityOptions执行、编译与安全选项
ScriptResult / ScriptResult<T> / CompilationResult执行结果与编译结果
ScriptMonitor / ScriptTemplateManager执行监控与脚本模板管理

快速示例

csharp
// 求值表达式
var sum = await XiHanScript.EvalAsync<int>("1 + 2 * 3"); // 7

// 执行语句块,返回强类型结果
var result = await XiHanScript.RunAsync<int>("result = 10 * 20;");
if (result.IsSuccess)
{
    Console.WriteLine(result.Value); // 200
}

// 用构建器定制引擎
var engine = XiHanScript.CreateBuilder()
    .AddImport("System.Math")
    .WithTimeout(5000)
    .Build();

依赖模块

  • XiHan.Framework.Core — 唯一的框架内部依赖,提供模块化与依赖注入基座。
  • 第三方核心依赖:Microsoft.CodeAnalysis.CSharp(Roslyn),是动态编译能力的引擎所在。

相关模块

Released under The MIT License.