我们在写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#实现将字符串转换成代码并执行的更多相关文章

  1. Java将ip字符串转换成整数的代码

    下面代码是关于Java将ip字符串转换成整数的代码,希望对各位有较大用途. public class IpUtil { public static int Ip2Int(String strIp){ ...

  2. JS 实现"可读"字符串转换成"二进制的01"字符串

    问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...

  3. PHP面试题之驼峰字符串转换成下划线样式例子

    自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...

  4. js 字符串转换成数字的三种方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...

  5. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  6. js 字符串转换成数字(转)

    转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型返回的 ...

  7. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

  8. LoadRunner 如何将英文的字符串转换成UTF-8格式的字符串?

    7.48  如何手动转换字符串编码 1.问题提出 如何将英文的字符串转换成UTF-8格式的字符串? 2.问题解答 可以使用lr_convert_string_encoding函数将字符串从一种编码手动 ...

  9. 17.把字符串转换成整数[atoi]

    [题目] 把字符串转换成整数,需要考虑字符串有效性. [代码]  C++ Code  123456789101112131415161718192021222324252627282930313233 ...

随机推荐

  1. Nginx常见的安装方式

    Nginx常见的安装方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx的安装版本分为开发版.稳定版和过期版, Nginx安装可以使用yum或源码安装 ...

  2. python应用之socket编程

    tcp/udp下的socket的基本使用 基于tcp的socket Tcp是基于链接的,必须先启动服务端,然后启动客户端进行链接 服务端: ss = socket() #创建服务器套接字 ss.bin ...

  3. 【会话技术】Cookie技术 案例:访问时间

    创建时间:6.30 代码: package cookie; import java.io.IOException; import java.text.SimpleDateFormat; import ...

  4. Unity 渲染教程(一):矩阵

    转载:http://gad.qq.com/program/translateview/7181958 创建立方体网格.· 支持缩放.位移和旋转. · 使用变换矩阵. · 创建简单的相机投影. 这是关于 ...

  5. linux突然不能上网,eth0网卡消失

    情况:之前可以正常浏览网页,没有动其它的地方,浏览器突然不能上网 ifconfig # 发现eth0网卡不见了,只有lo卡 ifconfig -a # 发现了eth0,但是没有IP地址 dhclien ...

  6. http协议 c++ 接收

    http消息格式:header+\r\n\r\n+ chunkLen + \r\n + chunkData + \r\n + chunkLen + \r\n + chunkData +\r\n + 0 ...

  7. P1908 逆序对-(树状数组)

    https://www.luogu.org/problem/P1908 比较喜欢线段树,懒得用树状数组(只会套模板,位运算的精髓没有领悟到),一直没有记录树状数组代码,又得捡回来,趁这道题记录一下模板 ...

  8. mark-向量式编程

    numpy的速度→→→numpy中的向量式编程 from numpy to python https://www.labri.fr/perso/nrougier/from-python-to-nump ...

  9. [RN] React Native Image 实现placeholder占位图

    React Native Image 实现placeholder占位图 react-native Image没有placeholder这样的props,但是业务有需要这种场景, 解决方法为: 使用Im ...

  10. [FJOI2018]所罗门的宝藏

    大概是最后一篇题解,其实只是想颓废一下打个故事 据古代传说记载,所罗门王即是智慧的代表,又是财富的象征.他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方, ...