使用 c # 编译器编译代码
- 2020/04/13
本文介绍如何使用 c # 编译器编译来自文本源的代码。
原始产品版本: Visual Studio、.NET Framework
原始 KB 数: 304655
摘要
Microsoft .NET Framework 公开了允许以编程方式访问 c # 语言编译器的类。 如果要编写自己的代码编译实用程序,这可能很有用。 本文提供了示例代码,使您能够编译文本源中的代码。 通过应用程序,您只需生成可执行文件或生成可执行文件并运行它即可。 在编译过程中出现的任何错误都将显示在窗体上。
要求
Visual Studio
Visual c # 语言编译器
使用 c # 编译器编译代码
.NET Framework 提供 ICodeCompiler
编译器执行接口。 CSharpCodeProvider
类实现此接口,并提供对 c # 代码生成器和代码编译器的实例的访问权限。 下面的代码示例创建一个实例 CSharpCodeProvider
,并使用它来获取对接口的引用 ICodeCompiler
。
CSharpCodeProvider codeProvider = new CSharpCodeProvider();ICodeCompiler icc = codeProvider.CreateCompiler();
当您具有对接口的引用后 ICodeCompiler
,便可以使用它来编译源代码。 您将使用类将参数传递给编译器 CompilerParameters
。 如以下示例所示:
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();parameters.GenerateExecutable = true;parameters.OutputAssembly = Output;CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);
上面的代码使用该 CompilerParameters
对象来通知编译器您要生成可执行文件(而不是 DLL),并且您希望将生成的程序集输出到磁盘。 对 CompileAssemblyFromSource
程序集进行编译的调用。 此方法采用 parameters 对象和源代码,这是一个字符串。 编译代码之后,可以检查是否存在任何编译错误。 您可以使用中的返回值 CompileAssemblyFromSource
,即 CompilerResults
对象。 此对象包含 errors 集合,该集合包含编译过程中发生的任何错误。
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; }}
还有其他一些编译选项,如从文件编译。 您还可以批量编译,这意味着您可以同时编译多个文件或源。
分步过程示例
创建新的 Visual c # .NET Windows 应用程序。 默认情况下会创建Form1 。
向Form1中添加一个 "按钮" 控件,然后将其 " Text " 属性更改为 "生成"。
向Form1中添加另一个按钮控件,然后将其Text属性更改为 "运行"。
向Form1中添加两个 TextBox 控件,将两个控件的多行属性设置为True,然后调整这些控件的大小,以便可以将多行文本粘贴到每一行。
在代码编辑器中,打开 " Form1.cs " 源文件。
在
Form1
类中,粘贴以下按钮单击处理程序。C#private void button1_Click(object sender, System.EventArgs e){ CSharpCodeProvider codeProvider = new CSharpCodeProvider(); ICodeCompiler icc = codeProvider.CreateCompiler(); string Output = "Out.exe"; Button ButtonObject = (Button)sender; textBox2.Text = ""; System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); //Make sure we generate an EXE, not a DLL parameters.GenerateExecutable = true; parameters.OutputAssembly = Output; CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text); if (results.Errors.Count > 0) { textBox2.ForeColor = Color.Red; 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 { //Successful Compile textBox2.ForeColor = Color.Blue; textBox2.Text = "Success!"; //If we clicked run then launch our EXE if (ButtonObject.Text == "Run") Process.Start(Output); }}
在文件的开头,添加以下
using
语句:C#using System.CodeDom.Compiler;using System.Diagnostics;using Microsoft.CSharp;
在Form1.cs中,找到
Form1
构造函数。InitializeComponent
在构造函数中调用后Form1
,添加以下代码以将按钮单击处理程序连接到添加到 Form1 的两个按钮。C#public Form1(){ InitializeComponent(); this.button1.Click += new System.EventHandler(this.button1_Click); this.button2.Click += new System.EventHandler(this.button1_Click);}
运行项目。 加载Form1后,单击 "生成" 按钮。
备注
您会收到编译器错误。
接下来,将以下文本复制到 textbox 中,以替换任何现有文本:
C#using System;namespace HelloWorld{ /// <summary> /// Summary description for Class1. /// </summary> class HelloWorldClass { static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.ReadLine(); } }}
再次单击 "生成"。 编译应成功。
单击 "运行",它将编译代码并运行生成的可执行文件。 编译将创建一个名为Out.exe的可执行文件,该文件保存在您正在运行的应用程序所在的同一文件夹中。
备注
您可以修改 textbox 中的代码以查看不同的编译器错误。 例如,删除其中一个分号并重新生成代码。
最后,修改 textbox 中的代码,以将另一行文本输出到控制台窗口。 单击 "运行" 以查看输出。