我正在尝试构建一个将不同的语言转换为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#编译器或任何.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);
        }
    }
}

关于c# - 从C#程序运行C#编译器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7721406/

10-17 01:13