关于程序员:如何用C动态编译

大家都晓得,在ASP.NET中利用CodeBehind技术编写好的文件必须先通过编译,而后能力被执行。咱们个别是在VS.NET中或者命令行下进行编译,那么当初的问题就是在程序中进行编译,也就是本人通过做好的规定动静生成一些程序源文件、而后对其进行编译。查看.Net Framework中提供的类库,发现了Microsoft.Csharp这个命名空间,其中有一个类Compiler。要调用这个类库必须先在援用中增加D:/WINNT/Microsoft.NET/Framework/v1.0.3705/cscompmgd.dll这个文件,这是我机器上的门路,各位依据本人机器所在门路设置吧。

 

认真钻研Compiler这个类:不须要初始化,间接可应用Compile办法,其中蕴含了5个参数。

string[] sourceTexts 源代码数组 其中每一个值蕴含一个文件中的源码

string[] sourceTextNames 源文件名数组 其中每一个值蕴含了一个文件名和下面的源代码数组中的值一一对应。

string target 输入的文件名

string[] imports 援用类库数组 也就是咱们在VS.net中援用的那些类库的文件门路,个别都是dll文件,其中一个值示意一个援用文件。

IDictionary options 参数设置,实际上这也是一个数组,能够蕴含多个参数,具体的参数我在上面的局部会讲到。

 

理论这个Compile这个办法要求咱们输出这些条件:

1、源代码——这个是必须的,没有源代码没法编译,那么源代码要求咱们从程序文件中读取进去。

2、源文件的名称,和读取出的源代码一一对应。

3、编译输入的文件名,也可不填

4、援用的类库文件,如System.dll,System.data.dll这些都是常常会用到的。

5、其余参数设置

 

第一步:创立一个类及调用办法

首先咱们创立一个Class

using System;

using System.IO;

using System.Text;

using Microsoft.CSharp;

 

namespace MyTest

{
private String[] filelist; //文件列表

private String[] cscode; //源代码

private String[] filename; //文件名

private String[] import; //援用类库

public class MyComplier()

{
 

//这里我做了一个简略的办法,要求用户输出两个参数,一个是文件夹的绝对路径

另外一个是输入的文件门路

public CompilerError[] MyCompile(String realpath,String output)

{
//……………………

}

 

}

}

那么上面咱们会一步步来解说如何实现这个办法。

 

第二步:读取程序文件列表

 

因为应用CodeBehind,那么实际上要编译的也就是扩大名为CS的文件。首先读取文件列表,制作一个办法用来读取目录下的文件门路:通过用户输出的绝对路径对文件进行整顿搜寻。

 

public String[] GetFileList(String realpath)//输出绝对路径

{
return System.IO.Directory.GetFiles(realpath,”*.cs”);//输出搜寻条件

}

 

本办法将要编译的实在目录传递进入,而后返回目录下扩大名为CS的文件门路列表。那么读取文件的列表将会为文件中代码的获取及文件名的获取做筹备。

 

第三步:读取程序文件内容

//这里咱们调用了第二步建设的办法来获取文件列表

filelist= GetFileList(realpath); //获取文件门路列表

//依据文件的数量创立数组

cscode=new String[filelist.Length]; //建设源代码数组

String[] filename=new String[filelist.Length];//建设源文件名数组

//通过循环获取每个文件的信息每减少到对应的数组中

For (int I=0;I< p>

{
String filepath= filelist. GetValue(i).ToString();//获取单个文件门路

cscode[I]= ReadTxtFile(filepath, Encoding.GetEncoding(“GB2312”));//读取源文件中的代码、这里的编码为GB2312,也可设置为其余,这里调用的是咱们上面创立的一个办法

filename[I]= System.IO.Path.GetFileName(filepath);//获取文件名

}

 

//读取文本文件内容

public String ReadTxtFile(String path,Encoding encode)

{
String str=””;

try

{
if (File.Exists(path))

{
StreamReader sr=new StreamReader(path,encode);

str=sr.ReadToEnd();

sr.Close();

}

}

catch(IOException ex)

{Console.Write(ex.ToString());}

return str;

}

通过第二步之后咱们曾经满足了Compile办法所需的两个参数了,那么接下来将是对文件的输入及援用的一些配置。

 

第四步:配置输入文件名及门路

此处可依据你的须要,设置文件和门路,例如:E:/test/bin/test.dll String output=” E://test//bin//test.dll”;

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据