You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用CS-Script或其他工具在C#程序中运行可传参的用户输入脚本?

可行方案解析

一、CS-Script 完全能满足需求

CS-Script专为C#脚本化执行设计,完美支持你要求的所有功能:传递参数、执行含条件判断/循环的复杂逻辑、修改传入的引用类型(包括DataTable)、返回值。

具体实现思路:

  1. 定义一个接口,让用户脚本实现该接口,主程序通过接口调用脚本逻辑,保证类型安全。
  2. 将主程序的DataTable作为参数传递给脚本方法——由于DataTable是引用类型,脚本内的修改会直接作用于原对象。
  3. 动态编译并加载用户输入的脚本代码,实例化接口对象后调用方法即可。

示例代码片段:
主程序中定义接口:

public interface IScriptLogic
{
    object Execute(DataTable data, params object[] args);
}

用户输入的脚本示例:

using System.Data;
public class UserScript : IScriptLogic
{
    public object Execute(DataTable data, params object[] args)
    {
        // 添加新列
        data.Columns.Add("NewColumn", typeof(string));
        // 修改现有行数据
        foreach (DataRow row in data.Rows)
        {
            row["NewColumn"] = $"{row["ExistingColumn"]}_modified";
        }
        // 删除第一行
        data.Rows.RemoveAt(0);
        // 返回处理后的行数
        return data.Rows.Count;
    }
}

主程序加载执行脚本:

// userCode为用户输入的脚本字符串
var evaluator = CSScript.Evaluator;
// 引用主程序集,让脚本能找到IScriptLogic接口
evaluator.ReferenceAssembly(System.Reflection.Assembly.GetExecutingAssembly());
var scriptInstance = evaluator.CreateInstance<IScriptLogic>(userCode);
// 传入主程序的DataTable和其他参数
var result = scriptInstance.Execute(yourDataTable, param1, param2);

脚本中对DataTable的所有修改会直接同步到主程序的yourDataTable对象,完全符合需求。

二、其他可选方案

1. Roslyn 脚本引擎(微软官方)

Roslyn是.NET官方编译器平台,自带的脚本引擎可直接执行C#代码片段,无需强制定义接口,灵活性更高,且属于.NET SDK原生支持,无需额外安装第三方库。

示例代码:

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System.Data;

// 配置脚本选项,引用必要程序集并添加命名空间
var scriptOptions = ScriptOptions.Default
    .AddReferences(typeof(DataTable).Assembly)
    .AddImports("System", "System.Data");

// 定义要传递给脚本的变量
var globals = new { Data = yourDataTable, Param = "test_value" };

// 执行用户脚本,直接操作DataTable并返回结果
var rowCount = await CSharpScript.EvaluateAsync<int>(@"
    Data.Columns.Add(""RoslynColumn"");
    foreach(var row in Data.Rows)
    {
        row[""RoslynColumn""] = ""processed"";
    }
    return Data.Rows.Count;", scriptOptions, globals);

优点:原生支持,兼容性强,长期维护有保障;缺点:强类型调用需额外配置,入门门槛略高。

2. dotnet-script

基于Roslyn的轻量化命令行脚本工具,可嵌入.NET程序使用,支持完整C#语法,和CS-Script功能类似,但更侧重快速脚本执行场景。

方案选择建议

  • 追求简单易用、快速集成:选CS-Script,API直观,对新手友好。
  • 倾向官方原生、无第三方依赖:优先Roslyn脚本引擎,与.NET平台兼容性最佳。
  • 需要轻量化脚本环境:可选择dotnet-script。

内容的提问来源于stack exchange,提问作者G Bradley MacDonald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:57:10