首先解释一下:
这里用到了几个类,CodeDomProvider 、CompilerParameters 、CompilerResults 。
CodeDomProvider类提供了我们编译代码的容器,我们通过它来工作;
大家都知道,现在我们要做的是一个很复杂的过程,因为这个程序要编译其他人写的代码,所以肯定需要配置很多的参数,这时我们就要用到CompilerParameters类;
最后我们生成了最后的exe文件,但那是我们完全正确的时候,如果错误了怎么办呢?这时我们肯定需要程序给出一个结果,告诉我们我们这个复杂的过程最后造成了什么样的“后果”,无论对或错,总会有个结果啊,这时就用到了 CompilerResults 类。
这里的textBox2用来显示最后的结果,是成功了,还是失败了,失败的话会有错误信息;textBox1是要执行的代码,我们可以在运行是复制过来。
下面是我的代码:
//CodeDomProvider 可用于创建和检索代码生成器和代码编译器的实例。
//代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集.
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");//指定编程语言
string Output = "Out.exe";//指定最后产生的程序的名字,它将和我们这个程序在一个目录下
textBox2.Text = "";
//表示用于调用编译器的参数
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
//获取或设置一个值,该值指示是否生成可执行文件。true表示EXE, false表示 DLL
parameters.GenerateExecutable = true;
//获取或设置输出程序集的名称。
parameters.OutputAssembly = Output;
//获取或设置一个值,该值指示是否在已编译的可执行文件中包含调试信息。
parameters.IncludeDebugInformation = true;
//获取当前项目所引用的程序集。根据具体需要添加
parameters.ReferencedAssemblies.Add("system.dll");
parameters.ReferencedAssemblies.Add("system.data.dll");
parameters.ReferencedAssemblies.Add("system.Drawing.dll");
parameters.ReferencedAssemblies.Add("system.Windows.Forms.dll");
parameters.ReferencedAssemblies.Add("Interop.IWshRuntimeLibrary.dll");
//CompileAssemblyFromSource方法从包含源代码的字符串的指定数组,使用指定的编译器设置编译程序集。
//CompilerResults表示从编译器返回的编译结果
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);
//获取编译器错误和警告的个数
if (results.Errors.Count > 0)
{
foreach (CompilerError CompErr in results.Errors)
{
textBox2.Text = textBox2.Text +
"Line number " + CompErr.Line +
", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + ";" +
Environment.NewLine + Environment.NewLine;
}
}
else
{
//成功了
textBox2.Text = "Success!";