C#实现将字符串转换成代码并执行
我们在写JavaScript程序的时候,有一个函数很有趣,eval(),这个方法非常有趣,他可以编译他内部的字符串,并将字符串按照JS代码执行,例如eval(‘alert(“message”)’),执行的结果就是弹窗打印出message这个信息。如下图

最近我在用C#写一个功能的时候的时候也遇到相似的需求,我的要求是自定义一个对字符串的验证代码,在程序执行的过程中对自定义的代码进行编译并执行,最后返回执行的结果。自定义的验证代码可以保存在文件中,也可以保存到数据库中,在需要的时候取出验证的代码,并执行。
要执行这样的功能可以有几种方案可以实现。
方案一、
通过拼接字符串的方式,生成一个cs类文件,再使用反射的方式调用此cs文件即可,此方式最简单,只需要熟练使用反射的相关知识即可。
方案二、
使用CSharpCodeProvider对象来解析字符串并通过反射的方式执行。
上面两种方案都需要熟练使用反射的技术,方案一相对来说比较简单,这里主要学习使用方案二来是实现相关功能。
使用方案二需要了解以下几个类。
CSharpCodeProvider, ICodeCompiler, CompilerParameters, CompilerResults
下面是一个示例程序
//1.创建CSharpCodeProvider的实例
CSharpCodeProvider cs = new CSharpCodeProvider();
//2.创建一个ICodeComplier对象
ICodeCompiler cc = cs.CreateCompiler();
//3.创建一个CompilerParameters的实例
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;//设定在内存中创建程序集
cp.GenerateExecutable = false;//设定是否创建可执行文件,也就是exe文件或者dll文件
cp.ReferencedAssemblies.Add("System.dll");//此处代码是添加对应dll文件的引用
cp.ReferencedAssemblies.Add("System.Core.dll");//System.Linq存在于System.Core.dll文件中
//4.创建CompilerResults的实例
string strExpre= "using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DynamicCompileTest{public class TestClass1{public bool CheckBool(string source){ return source.Contains(\"SC\"); }}}";
CompilerResults cr = cc.CompileAssemblyFromSource(cp, strExpre);
if (cr.Errors.HasErrors)
{
Console.WriteLine(cr.Errors.ToString());
}
else
{
//5.创建一个Assembly对象
Assembly ass = cr.CompiledAssembly;//动态编译程序集
object obj = ass.CreateInstance("DynamicCompileTest.TestClass1");
MethodInfo mi = obj.GetType().GetMethod("CheckBool");
bool result = (bool)mi.Invoke(obj, new object[] { "LYF" });
}
Console.ReadKey();
总体来说,两个方案都是通过拼接字符串最后形成可执行的代码来实现的,与我们平时在VS中写代码的方式相同。
C#实现将字符串转换成代码并执行的更多相关文章
- Java将ip字符串转换成整数的代码
下面代码是关于Java将ip字符串转换成整数的代码,希望对各位有较大用途. public class IpUtil { public static int Ip2Int(String strIp){ ...
- JS 实现"可读"字符串转换成"二进制的01"字符串
问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...
- PHP面试题之驼峰字符串转换成下划线样式例子
自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...
- js 字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- js 字符串转换成数字(转)
转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的 ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
- LoadRunner 如何将英文的字符串转换成UTF-8格式的字符串?
7.48 如何手动转换字符串编码 1.问题提出 如何将英文的字符串转换成UTF-8格式的字符串? 2.问题解答 可以使用lr_convert_string_encoding函数将字符串从一种编码手动 ...
- 17.把字符串转换成整数[atoi]
[题目] 把字符串转换成整数,需要考虑字符串有效性. [代码] C++ Code 123456789101112131415161718192021222324252627282930313233 ...
随机推荐
- Nginx 高级配置-变量使用
Nginx 高级配置-变量使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用,变量可以分为内置变量和自定义变 ...
- Jenkins+SVN+Ant在Linux环境下自动完成版本的增量更新与编译
第一步:查看安装的jdk版本,查看是否安装ant,查看是否安装Jenkins java -version ant -version rpm -qa|grep jenkins 第二步:安装ant 官网: ...
- 字符串比较==和equals的区别
<Stack Overflow 上 370万浏览量的一个问题:如何比较 Java 的字符串?> 比较详细的比较了==和equals方法的区别. 那借此机会,我就来梳理一下 Stack Ov ...
- 201871010108-高文利《面向对象程序设计(java)》第二周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...
- matlab-画地形图
1.画三维图 之前画曲面的三维图,运用z=x2+y2 算出z和Z,如果是给出数据的地形则没办法用公式算,为此,引入插值自动造出地形的坐标. 拟合和插值的区别:插值是必须要过点,曲线可以不光滑:拟合则是 ...
- docker自定义镜像上传阿里云
1.alpine制作jdk镜像 2.Alpine制作jre镜像(瘦身) 3.Docker镜像上传至阿里云 alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻 ...
- es4x 使用nodejs 开发vertx 应用框架试用
es4x 是将vertx 的特性带到nodejs 的开发中,性能很不错,同时开发方式和nodejs 一样,可以加速vertx 应用的开发,同时也可以方便的集成java 软件包,提供的cli 工具也很方 ...
- ABP .net framework版 的发布
先正常的发布流程走 特别的如下图
- 牛客NOIP暑期七天营-提高组1
牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...
- ping-pong buffer
1 什么是pingpong? pingpong是一种数据缓存的手段,通过pingpong操作可以提高数据传输的效率. 2 什么时候需要pingpong? 在两个模块间交换数据时,上一级处理的结果不能马 ...