cs-script通用调用动态脚本封装方法

cs-script 318 318
cs-script
Jordan
Jordan 2024-10-06 18:42:11

概述

  • 通过对cs-script进行封装调用标准方法

代码

/// <summary>
/// 执行标准方法参数一定要有param, 有一个唯一的方法 Execute
///
///  using System;
///
///  public static Object Execute(Dictionary<string,object> param){ // code}
/// </summary>
/// <param name="scriptContent"></param>
/// <param name="param">入口参数</param>
/// <returns></returns>
public static Object RunStandMethod(string scriptContent,Object param, List<string> useList = null)
{
    try
    {
        //得到引用的程序集
        List<String> defaultUseList = new List<string>()
        {
            "System",
            "System.Text"
        };

        List<String> lstUse = new List<string>();
        //加载默认的
        lstUse.AddRange(defaultUseList);

        if (useList != null)
        {
            foreach (var curUse in useList)
            {
                if (!lstUse.Contains(curUse))
                {
                    lstUse.Add(curUse);
                }
            }
        }

        StringBuilder sbCodeContent = new StringBuilder();

        //加入引用的程序集
        foreach (string s in lstUse)
        {
            sbCodeContent.AppendLine($"using {s};");
        }

        //加入静态代码
        //sbCodeContent.Clear();
        sbCodeContent.AppendLine("Object Execute(Object o)");
        sbCodeContent.AppendLine("{");
        sbCodeContent.AppendLine(scriptContent);
        sbCodeContent.AppendLine("}");

        string code = sbCodeContent.ToString();

        // 构造编译环境
        var eval = CSScript.Evaluator;
        eval.Reset(false);

        //加入相关的程序集
        foreach (Assembly referencedAssembly in eval.GetReferencedAssemblies())
        {
            Console.WriteLine(referencedAssembly.FullName);
        }

        eval.ReferenceAssembliesFromCode(code)
            .ReferenceAssembly(Assembly.GetExecutingAssembly())
            .ReferenceAssembly(Assembly.GetExecutingAssembly().Location);

        dynamic dyInfo = eval.LoadMethod(code);

        // 列出当前的所有的引用程序集
        foreach (Assembly referencedAssembly in eval.GetReferencedAssemblies())
        {
            Console.WriteLine(referencedAssembly.FullName);
        }

        var o = dyInfo.Execute(param);

        return o;
    }
    catch (Exception ex)
    {
        LogHelper.WriteLog(ex.Message);
    }

    return null;
}

代码说明

  • useList 可以引入外部的引用程序集
  • 将动态脚本封装在一个新的方法中 Object Execute(Object o),形成新的代码内容,用于cs-script来进行执行
  • 使用Object o 传入参数
  • 返回Object 传出参数

使用方向

1、业务逻辑动态执行
2、工作流路由判断

注意点

1、最主要的是性能问题

回帖
  • 消灭零回复
作者信息
主题分类
相关文章