欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现将字符串转换成代码并执行

程序员文章站 2022-06-08 15:37:41
我们在写JavaScript程序的时候,有一个函数很有趣,eval(),这个方法非常有趣,他可以编译他内部的字符串,并将字符串按照JS代码执行,例如eval(‘alert(“message”)’),执行的结果就是弹窗打印出message这个信息。如下图 最近我在用C#写一个功能的时候的时候也遇到相似 ......

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

 C#实现将字符串转换成代码并执行

 

 

最近我在用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中写代码的方式相同。