在c#编写的软件中动态地编译新的代码

本文介绍如何在C#程序中使用CodeDomProvider、CompilerParameters和CompilerResults类动态编译代码,并展示了编译过程及错误处理。示例代码演示了编译一个Windows自动ADSL拨号程序的过程。
摘要由CSDN通过智能技术生成

 

首先解释一下:

这里用到了几个类,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!";

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值