乐趣区

关于程序员:如何用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”;

退出移动版