【问题标题】:Running the C# compiler from a C# program从 C# 程序运行 C# 编译器
【发布时间】:2011-10-11 04:35:55
【问题描述】:

我正在尝试构建一个将不同语言转换为 C# 代码的 C# 程序。我的程序工作正常,转换代码并将其写入 .cs 文件。我想让这个文件自动编译并运行,但是我不知道如何用 C# 来做到这一点。

我可以通过简单地运行我编写的批处理文件来手动完成,我尝试使用 System.Diagnostics.Process 类从 C# 运行这个批处理文件。当它运行时,它在批处理代码本身中出现错误,说没有找到任何命令(通常的“不是可执行文件,批处理文件等”)。我不知道为什么它可以正常运行,但从 C# 运行时却不行。

这是批处理文件的代码: C:\Program_Files_(x86)\Microsoft_Visual_Studio 10.0\VC\bin\amd64\vcvars64.bat csc %1.cs 暂停

以及调用它的函数:

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "compiler\\compile.bat";
process.StartInfo.Arguments = " "+fileName;
process.Start();
process.WaitForExit();
process.StartInfo.FileName = fileName + ".exe";
process.Start();
process.WaitForExit();
Console.WriteLine("done");

任何帮助将不胜感激。

【问题讨论】:

标签: c# batch-file compilation csc


【解决方案1】:

不要使用批处理脚本调用 C# 编译器或 .net 平台的任何编译器 - 这是一种不好的做法。您只能使用 C# 来执行此操作。 使用CodeDomProvider 类,您可以轻松编写。

  static void CompileCSharp(string code) {
    CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
    ICodeCompiler compiler = provider.CreateCompiler();
    CompilerParameters parameters = new CompilerParameters();
    parameters.OutputAssembly = @"D:\foo.exe";
    parameters.GenerateExecutable = true;
    CompilerResults results = compiler.CompileAssemblyFromSource(parameters, code);
    if (results.Output.Count == 0)
    {
        Console.WriteLine("success!");
    }
    else
    {
        CompilerErrorCollection CErros = results.Errors;
        foreach (CompilerError err in CErros)
        {
            string msg = string.Format("Erro:{0} on line{1} file name:{2}", err.Line, err.ErrorText, err.FileName);
            Console.WriteLine(msg);
        }
    }
}

【讨论】:

  • CompileAssemblyFromSource 由 CompilerParameters 和 string[] 调用,也由 CompileAssemblyFromFile 从文件中调用
  • 非常感谢您。我记得以前遇到过codedom,但我忘记了。只是出于好奇,为什么这是不好的做法?我知道在这种特殊情况下,codedom 更好,但是如果这不是用 .NET 编写的呢?命令行会好吗?那么我是否必须使用 dll。
  • 使用设置为参数的 dll。 ex)parameters.ReferencedAssemblies.Add("System.dll");
  • 我认为他的意思是这是一种不好的做法,因为有本地方法可以这样做。
  • ICodeCompiler 编译器 = provider.CreateCompiler();现在已弃用。见:msdn.microsoft.com/en-us/library/…
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多