3

我正在制作一个 C 编译器,我必须知道是否可以使用 CodeDom 在 c# 中编译 C 代码,目前我正在使用以下代码来编译 c# windows 形式的 C# 代码?

有没有简单的方法来编译 C 语言的代码?

using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;
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);
   }
}
4

2 回答 2

3

您没有制作编译器。您正在为编译器创建接口。不,你不能用CodeDom这个。为什么不直接使用 C 编译器呢?您可以为此目的使用大量资源。捕获STDOUT- 有编译器输出格式的一般准则,解析它们应该是一项相当简单的任务。

您也可以尝试研究嵌入 C 解释器。现在可能很有趣。更有趣的是:编写自己的 C 解释器(比编译器更容易实现)。

于 2012-05-31T11:05:20.357 回答
2

我认为您正在关注 -如何使用 C# 编译器以编程方式编译代码

在为您的工作使用任意代码之前,请仔细检查它是否适合您的要求。您正在使用的是 .net 框架内部编译帮助程序类。检查该文章的以下几行。

.NET Framework 公开了允许您以编程方式访问 C# 语言编译器的类。如果您想编写自己的代码编译实用程序,这可能很有用。

和要求

  • 视觉工作室
  • Visual C# 语言编译器

那么如何c program使用这些.net 库类进行编译。

您可以使用 c 编译器 exe,并使用该编译器可以在控制台应用程序中编译文件或使用Process.net 中的类。

您可以从命令行编译 c,只需在 c# 中使用相同的代码,redirectstandardoutput即可获得同样显示的输出。

Process proc = new Process();
proc.StartInfo.FileName = "compiler name";
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
string output = proc.StandardOutput.ReadToEnd();

参考

于 2012-05-31T11:14:12.890 回答