从C#程序调用G ++

时间:2014-09-24 12:42:44

标签: c# c++ batch-file gcc

我在C#中创建了一个C ++代码编辑器,现在我正在尝试调用g++来编译源文件。所以我除了我的程序之外还复制了TDM-GCC安装并编写了一个小批量脚本来调用它。

@echo off
@set PATH="%~dp0TDM-GCC-32\bin\";%PATH%
call "%~dp0TDM-GCC-32\mingwvars.bat"
cd %1
"%~dp0TDM-GCC-32\bin\g++.exe" %2 -o %3

从C#代码开始,我试图像在这段代码中一样使用CMD来调用这个脚本。

string fileName   = Path.GetFileName(CurrentFile);
string exeName    = Path.GetFileNameWithoutExtension(CurrentFile) + ".exe";
string workingDir = Directory.GetParent(CurrentFile) + "";
string compile    = Directory.GetParent(Application.ExecutablePath) + "\\compile.cmd";

File.Delete(Path.Combine(workingDir, exeName));

StartProcess(true, "cmd", "/c", "\"" + compile + "\"", workingDir, fileName, exeName);

这是StartProcess方法:

void StartProcess(bool hidden, string command, params string[] args)
{
    ProcessStartInfo pStartInfo = new ProcessStartInfo();

    pStartInfo.FileName = command;
    pStartInfo.Arguments = string.Join(" ", args);
    pStartInfo.UseShellExecute = false;

    if (hidden)
    {
        pStartInfo.RedirectStandardError  = true;
        pStartInfo.RedirectStandardOutput = true;
        pStartInfo.CreateNoWindow = true;
    }

    Process proc = new Process();
    proc.StartInfo = pStartInfo;

    proc.Start();

    logBox.Clear();

    if (hidden)
    {
        while (!proc.StandardError.EndOfStream)
        {
            logBox.AppendText(GetTimestamp() + "  Error: " + proc.StandardError.ReadLine() + Environment.NewLine);
        }
    }
}

更新:26-9-14

我怀疑是否曾经调用批处理文件,因为如果我从cmd调用它,它就会起作用。所以我尝试echo批处理文件中的标准错误,如下所示:

echo %PATH% 1>&2

我可以看到GCC的bin文件夹也在路径中,但由于某种原因,exe没有被创建。但有时,脚本可以工作,并且exe会被创建。

但每当我执行此操作时,LOG中都没有任何内容,也没有创建可执行文件。我知道TDM-GCC的bin文件夹必须在PATH中,但这就是批处理脚本的第二行需要做的事情。不知道这是什么以及为什么会出现这个错误。

更新结束

有关如何使其正常工作的任何建议?

感谢。

2 个答案:

答案 0 :(得分:1)

我不知道下面的任何内容是否对这个问题有帮助。但至少这些提示在任何情况下都应该是有用的。

我建议使用批处理文件

@echo off
call "%~dp0TDM-GCC-32\mingwvars.bat"
set "PATH=%~dp0TDM-GCC-32\bin;%PATH%"
cd /D %1
"%~dp0TDM-GCC-32\bin\g++.exe" %2 -o %3
执行mingwvars.bat后修改

PATH 。可能是此批处理文件还修改了 PATH 。或者它运行find.exe之类的命令以及%SystemRoot%\System32中预期的可执行文件,但也可能存在于目录bin中。我已经多次看到不能使用登录批处理脚本,因为客户端计算机上的 PATH 包含在第一个文件夹路径中,编译器的bin目录从Unix移植到Windows,并且可执行文件也可以在{{{ 1}},但是从Unix移植完全不同。

即使文件夹路径包含1个或多个空格,也应将文件夹路径添加到环境变量 PATH ,不带双引号。第三行中使用的双引号只是确保在 PATH 之外不添加尾随空格,并且该命令%SystemRoot%\System32即使不是典型的文件夹路径(如路径中的&符号)也能正常工作。

应将文件夹路径添加到环境变量 PATH ,而不使用反斜杠。

在命令set上,如果必须更改不同的驱动器,还会使用参数cd。如果指定的路径位于不带参数/D的其他驱动器上,则命令cd不会更改当前目录。

在C#代码中,您必须确保/DworkingDirfileName最终在exeName执行参数字符串中用双引号括起来cmd.exe cmd 3}}已经写过。

最好在C#应用程序中读取环境变量 ComSpec 的值,并使用此值代替{{1}}来执行批处理文件。

答案 1 :(得分:0)

这可能是,也可能不是问题的一部分,但你不会照顾空间。

pStartInfo.Arguments = string.Join(" ", args);
你可能想要这样的东西:

pStartInfo.Arguments = string.Join(" ", args.Select(x => "\"" + x + "\""));