概述
- 通过对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、最主要的是性能问题