我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#如何实现动态执行字符串脚本

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#如何实现动态执行字符串脚本

这篇文章主要介绍了C#如何实现动态执行字符串脚本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何实现动态执行字符串脚本文章都会有所收获,下面我们一起来看看吧。

先来代码

using System;using System.Data;using System.Configuration;using System.Text;using System.CodeDom.Compiler;using Microsoft.CSharp;using System.Reflection;using System.Collections.Generic;namespace 检漏仪上位机{    /// <summary>    /// 本类用来将字符串转为可执行文本并执行    /// 从别处复制,勿随意更改!    /// </summary>    public class Evaluator    {        #region 构造函数        /// <summary>        /// 可执行串的构造函数        /// </summary>        /// <param name="items">        /// 可执行字符串数组        /// </param>        public Evaluator(EvaluatorItem[] items, Dictionary<string, string> listAssemblies = null)        {            ConstructEvaluator(items, listAssemblies);      //调用解析字符串构造函数进行解析        }        /// <summary>        /// 可执行串的构造函数        /// </summary>        /// <param name="returnType">返回值类型</param>        /// <param name="expression">执行表达式</param>        /// <param name="name">执行字符串名称</param>        public Evaluator(Type returnType, string expression, string name, Dictionary<string, string> listAssemblies = null)        {            //创建可执行字符串数组            EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };            ConstructEvaluator(items, listAssemblies);      //调用解析字符串构造函数进行解析        }        public Evaluator(string allCode, string _namespace, string _class, List<string> listAssemblies = null)        {            ConstructEvaluatorByAllCode(allCode, _namespace, _class, listAssemblies);      //调用解析字符串构造函数进行解析        }        /// <summary>        /// 可执行串的构造函数        /// </summary>        /// <param name="item">可执行字符串项</param>        public Evaluator(EvaluatorItem item, Dictionary<string, string> listAssemblies = null)        {            EvaluatorItem[] items = { item };//将可执行字符串项转为可执行字符串项数组            ConstructEvaluator(items, listAssemblies);      //调用解析字符串构造函数进行解析        }        /// <summary>        /// 解析字符串构造函数        /// </summary>        /// <param name="items">待解析字符串数组</param>        private void ConstructEvaluator(EvaluatorItem[] items, Dictionary<string, string> listAssemblies = null)        {            //创建C#编译器实例            ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());            //编译器的传入参数            CompilerParameters cp = new CompilerParameters();            cp.ReferencedAssemblies.Add("system.dll");              //添加程序集 system.dll 的引用            cp.ReferencedAssemblies.Add("system.data.dll");         //添加程序集 system.data.dll 的引用            cp.ReferencedAssemblies.Add("system.xml.dll");          //添加程序集 system.xml.dll 的引用            cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");          //添加程序集 system.xml.dll 的引用            cp.GenerateExecutable = false;                          //不生成可执行文件            cp.GenerateInMemory = true;                             //在内存中运行            StringBuilder code = new StringBuilder();               //创建代码串            if (listAssemblies != null)            {                foreach (var item in listAssemblies)                {                    cp.ReferencedAssemblies.Add(item.Key);              //添加程序集 引用                    code.Append("using "+item.Value + "; \n");                }            }                        code.Append("using System; \n");            code.Append("using System.Data; \n");            code.Append("using System.Data.SqlClient; \n");            code.Append("using System.Data.OleDb; \n");            code.Append("using System.Xml; \n");            code.Append("using System.Windows.Forms; \n");            code.Append("namespace EvalGuy { \n");                  //生成代码的命名空间为EvalGuy,和本代码一样            code.Append(" public class _Evaluator { \n");          //产生 _Evaluator 类,所有可执行代码均在此类中运行            foreach (EvaluatorItem item in items)               //遍历每一个可执行字符串项            {                code.AppendFormat("    public {0} {1}() ",          //添加定义公共函数代码                                item.ReturnType == null ? "void" : item.ReturnType.Name,             //函数返回值为可执行字符串项中定义的返回值类型                                  item.Name);                       //函数名称为可执行字符串项中定义的执行字符串名称                code.Append("{ ");                                  //添加函数开始括号                if (item.ReturnType != null)                    code.AppendFormat("return ({0});", item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值                else                {                    code.Append(item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值                }                code.Append("}\n");                                 //添加函数结束括号            }            code.Append("} }");                                 //添加类结束和命名空间结束括号            //得到编译器实例的返回结果            CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());            if (cr.Errors.HasErrors)                            //如果有错误            {                StringBuilder error = new StringBuilder();          //创建错误信息字符串                error.Append("编译有错误的表达式: ");                //添加错误文本                foreach (CompilerError err in cr.Errors)            //遍历每一个出现的编译错误                {                    error.AppendFormat("{0}\n", err.ErrorText);     //添加进错误文本,每个错误后换行                }                throw new Exception("编译错误: " + error.ToString());//抛出异常            }            Assembly a = cr.CompiledAssembly;                       //获取编译器实例的程序集            _Compiled = a.CreateInstance("EvalGuy._Evaluator");     //通过程序集查找并声明 EvalGuy._Evaluator 的实例        }        private void ConstructEvaluatorByAllCode(string allcode, string _namespace, string _class, List<string> listAssemblies)        {            if (listAssemblies == null)            {                listAssemblies = new List<string>();            }            //创建C#编译器实例            ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());            //编译器的传入参数            CompilerParameters cp = new CompilerParameters();            if (!listAssemblies.Contains("system.dll"))            {                listAssemblies.Add("system.dll");                listAssemblies.Add("system.data.dll");                listAssemblies.Add("system.xml.dll");            }            foreach (var item in listAssemblies)            {                cp.ReferencedAssemblies.Add(item);            }            cp.GenerateExecutable = false;                          //不生成可执行文件            cp.GenerateInMemory = true;                             //在内存中运行            //得到编译器实例的返回结果            CompilerResults cr = comp.CompileAssemblyFromSource(cp, allcode);            if (cr.Errors.HasErrors)                            //如果有错误            {                StringBuilder error = new StringBuilder();          //创建错误信息字符串                error.Append("编译有错误的表达式: ");                //添加错误文本                foreach (CompilerError err in cr.Errors)            //遍历每一个出现的编译错误                {                    error.AppendFormat("{0}\n", err.ErrorText);     //添加进错误文本,每个错误后换行                }                throw new Exception("编译错误: " + error.ToString());//抛出异常            }            Assembly a = cr.CompiledAssembly;                       //获取编译器实例的程序集            _Compiled = a.CreateInstance($"{_namespace}.{_class}");     //通过程序集查找并声明 EvalGuy._Evaluator 的实例        }        #endregion        #region 公有成员        /// <summary>        /// 执行字符串并返回整型值        /// </summary>        /// <param name="name">执行字符串名称</param>        /// <returns>执行结果</returns>        public int EvaluateInt(string name)        {            return (int)Evaluate(name);        }        /// <summary>        /// 执行字符串并返回字符串型值        /// </summary>        /// <param name="name">执行字符串名称</param>        /// <returns>执行结果</returns>        public string EvaluateString(string name)        {            return (string)Evaluate(name);        }        /// <summary>        /// 执行字符串并返回布尔型值        /// </summary>        /// <param name="name">执行字符串名称</param>        /// <returns>执行结果</returns>        public bool EvaluateBool(string name)        {            return (bool)Evaluate(name);        }        /// <summary>        /// 执行字符串并返 object 型值        /// </summary>        /// <param name="name">执行字符串名称</param>        /// <returns>执行结果</returns>        public object Evaluate(string name)        {            MethodInfo mi = _Compiled.GetType().GetMethod(name);//获取 _Compiled 所属类型中名称为 name 的方法的引用            return mi.Invoke(_Compiled, null);                  //执行 mi 所引用的方法        }        #endregion        #region 静态成员        /// <summary>        /// 执行表达式并返回整型值        /// </summary>        /// <param name="code">要执行的表达式</param>        /// <param name="listAssemblies">需要引用到类库,key:dll名称,value:命名空间名称</param>        /// <returns>运算结果</returns>        static public int EvaluateToInteger(string code, Dictionary<string, string> listAssemblies = null)        {            Evaluator eval = new Evaluator(typeof(int), code, staticMethodName, listAssemblies);//生成 Evaluator 类的对像            return (int)eval.Evaluate(staticMethodName);                        //执行并返回整型数据        }        /// <summary>        /// 执行表达式并返回字符串型值        /// </summary>        /// <param name="code">要执行的表达式</param>        /// <param name="listAssemblies">需要引用到类库,key:dll名称,value:命名空间名称</param>        /// <returns>运算结果</returns>        static public string EvaluateToString(string code, Dictionary<string, string> listAssemblies = null)        {            Evaluator eval = new Evaluator(typeof(string), code, staticMethodName, listAssemblies);//生成 Evaluator 类的对像            return (string)eval.Evaluate(staticMethodName);                     //执行并返回字符串型数据        }        /// <summary>        /// 执行表达式并返回布尔型值        /// </summary>        /// <param name="code">要执行的表达式</param>        /// <param name="listAssemblies">需要引用到类库,key:dll名称,value:命名空间名称</param>        /// <returns>运算结果</returns>        static public bool EvaluateToBool(string code, Dictionary<string, string> listAssemblies = null)        {            Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName, listAssemblies);//生成 Evaluator 类的对像            return (bool)eval.Evaluate(staticMethodName);                       //执行并返回布尔型数据        }        /// <summary>        /// 执行表达式并返回 object 型值        /// </summary>        /// <param name="code">要执行的表达式</param>        /// <param name="listAssemblies">需要引用到类库,key:dll名称,value:命名空间名称</param>        /// <returns>运算结果</returns>        static public object EvaluateToObject(string code, Dictionary<string, string> listAssemblies = null)        {            Evaluator eval = new Evaluator(typeof(object), code, staticMethodName, listAssemblies);//生成 Evaluator 类的对像            return eval.Evaluate(staticMethodName);                             //执行并返回 object 型数据        }        /// <summary>        /// 执行一个无返回式的代码        /// </summary>        /// <param name="code"></param>        /// <param name="listAssemblies">需要引用到类库,key:dll名称,value:命名空间名称</param>        static public void EvaluateToVoid(string code, Dictionary<string, string> listAssemblies = null)        {            Evaluator eval = new Evaluator(null, code, staticMethodName, listAssemblies);//生成 Evaluator 类的对像            eval.Evaluate(staticMethodName);                             //执行并返回 object 型数据        }        /// <summary>        /// 执行一个全代码        /// </summary>        /// <param name="code">全代码,包含命名空间引用,命名空间声明,类声明,函数声明等</param>        /// <param name="_namespace"></param>        /// <param name="_class"></param>        /// <param name="methodName">函数</param>        /// <param name="listAssemblies">需要引用到类库</param>        public static void EvaluateByAllCode(string code, string _namespace, string _class, string methodName, List<string> listAssemblies = null)        {            Evaluator eval = new Evaluator(code, _namespace, _class, listAssemblies);//生成 Evaluator 类的对像            eval.Evaluate(methodName);        }        #endregion        #region 私有成员        /// <summary>        /// 静态方法的执行字符串名称        /// </summary>        private const string staticMethodName = "__foo";        /// <summary>        /// 用于动态引用生成的类,执行其内部包含的可执行字符串        /// </summary>        object _Compiled = null;        #endregion    }    /// <summary>    /// 可执行字符串项(即一条可执行字符串)    /// </summary>    public class EvaluatorItem    {        /// <summary>        /// 返回值类型        /// </summary>        public Type ReturnType;        /// <summary>        /// 执行表达式        /// </summary>        public string Expression;        /// <summary>        /// 执行字符串名称        /// </summary>        public string Name;        /// <summary>        /// 可执行字符串项构造函数        /// </summary>        /// <param name="returnType">返回值类型</param>        /// <param name="expression">执行表达式</param>        /// <param name="name">执行字符串名称</param>        public EvaluatorItem(Type returnType, string expression, string name)        {            ReturnType = returnType;            Expression = expression;            Name = name;        }    }}

调用一个无返回值的代码,显示一个提示框

Evaluator.EvaluateToVoid("MessageBox.Show(\"Test\");",new Dictionary<string, string>() { { "System.Windows.Forms.dll", "System.Windows.Forms" } });

调用一个计算返回整型

Evaluator.EvaluateToInteger("1+2*3");

调用一个全代码

string str = @"using System;namespace a{     public class b    {        public  void c()        {            Console.WriteLine(1);        }    }}";Evaluator.EvaluateByAllCode(str, "a", "b", "c");

功能就这么多

关于“C#如何实现动态执行字符串脚本”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#如何实现动态执行字符串脚本”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#如何实现动态执行字符串脚本

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何实现动态执行字符串脚本

这篇文章主要介绍了C#如何实现动态执行字符串脚本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何实现动态执行字符串脚本文章都会有所收获,下面我们一起来看看吧。先来代码using System;using
2023-07-05

Redis 字符串实现:简单动态字符串-SDS与C字符串的区别

2.1 SDS的定义struct { //buf中已使用的字节数,等于SDS所保存字符串的长度 int len; //buf中未使用的字节长度 int free; //字节数组,用于保存字符串 char[] buf;}2.2
Redis 字符串实现:简单动态字符串-SDS与C字符串的区别
2020-09-07

C语言如何对字符串执行 ROT13 编码

ROT13是一种简单编码算法,用于替换字母表中字母位置。用C语言实现ROT13编码包括:创建字符串、遍历字符、按字母位置执行替换、存储编码字符和返回编码字符串。示例代码展示了如何用C语言实现ROT13编码,该编码主要用于匿名留言、简单密码和谜题。
C语言如何对字符串执行 ROT13 编码
2024-04-02

C#中如何构建动态SQL查询字符串

在C#中可以使用StringBuilder类来构建动态SQL查询字符串。以下是一个示例:using System.Text;StringBuilder sb = new StringBuilder();sb.Append("SELECT
C#中如何构建动态SQL查询字符串
2024-04-28

C#如何实现字符串搜索

小编给大家分享一下C#如何实现字符串搜索,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、正则表达式简介正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正
2023-06-18

Shell脚本如何实现查找字符串中某字符最后出现的位置

这篇文章将为大家详细讲解有关Shell脚本如何实现查找字符串中某字符最后出现的位置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需要对字符串查找其中某个字符最后出现的位置,这个在PHP (strrpos)
2023-06-09

C++如何实现回文子字符串

这篇文章主要介绍“C++如何实现回文子字符串”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++如何实现回文子字符串”文章能帮助大家解决问题。Palindromic Substrings 回文子字符
2023-06-19

如何实现IP动态切换bat脚本

这篇文章将为大家详细讲解有关如何实现IP动态切换bat脚本,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。新建"IP切换脚本.bat"文件,将下列代码复制进去,保存,并加入启动项,这样每次开机的时候选择你的
2023-06-08

C语言如何动态分配二维字符串数组

这篇文章给大家分享的是有关C语言如何动态分配二维字符串数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。动态分配一个二维字符串数组(1) 分配可能不连续的内存申请char**pps8Output = (char
2023-06-25

c语言如何实现字符串复制

在C语言中,可以使用strcpy()函数来实现字符串复制。具体实现方法如下:#include #include int main() {char str1[50] = "Hello, World!"
c语言如何实现字符串复制
2024-04-09

C语言如何实现字符串替换

在C语言中可以通过循环遍历字符串的每个字符,然后判断是否需要替换,如果需要替换则使用新的字符替换原字符。下面是一个示例代码,实现了字符串中某个字符的替换:```c#include #include void replace(char *st
2023-08-24

c语言如何实现字符串反转

C语言可以通过循环遍历字符串并交换字符的位置来实现字符串的反转。具体步骤如下:1. 首先,定义一个指向字符串的指针。2. 使用`strlen()`函数获取字符串的长度,即字符个数,保存在一个变量中。3. 使用两个指针,一个指向字符串的起始位
2023-09-12

如何实现一键自动更改本机IP地址的BAT执行脚本

这篇文章给大家分享的是有关如何实现一键自动更改本机IP地址的BAT执行脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。请把复制下面的脚本,另存为.bat文件,把其中的子网掩码,网关,IP,DNS等信息修改成你的
2023-06-08

如何编写Shell脚本实现快速去除字符串中的空格

这篇文章主要讲解了“如何编写Shell脚本实现快速去除字符串中的空格”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写Shell脚本实现快速去除字符串中的空格”吧!效果如下图所示,图上半
2023-06-09

jenkins如何实现shell脚本化定时执行任务

这篇文章将为大家详细讲解有关jenkins如何实现shell脚本化定时执行任务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.开发需求socket连接的auction拍卖jar包服务更新重启前半小时切走
2023-06-26

c语言中如何实现逆序字符串

这篇文章主要介绍了c语言中如何实现逆序字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用指针逆序字符串思路:给两个指针,left放在字符串左侧,right放在最后一个有
2023-06-26

如何通过脚本实现数据动态更新

在数据填报的场景中,常常会遇到根据条件动态更新数据的需求,例如:在条件 A 下将页面所有数据插入到数据库表中,而在条件 B 下则将页面中做了修改的数据更新到数据库表中。遇到这种需求,脑海中的第一个想法就是:存储过程更新、或者 java 代码
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录