2014-09-24 2 views
2

Я создал редактор кода C++ на C# и теперь пытаюсь вызвать g++ для компиляции исходных файлов. Поэтому я скопировал установку TDM-GCC, помимо моей программы, и написал небольшой пакетный скрипт для вызова этого.Вызов G ++ из C# Program

@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); 
     } 
    } 
} 

Update: 26-9-14

Я сомневался ли пакетный файл либо называется, потому что если я называю это из cmd, он просто работает. Так что я попытался echo к стандартной ошибки из пакетного файла, как это:

echo %PATH% 1>&2 

И я могу видеть, что папка бен в GCC находится в пути тоже, но по какой-то причине, ех не получает создан. Но иногда скрипт работает, и exe создается.

Но всякий раз, когда я выполняю это, в LOG ничего не будет, а также не создается исполняемый файл. Я знаю, что папка bin TDM-GCC должна находиться в PATH, но это то, что нужно сделать второй строке командного сценария. Не знаю, что это и почему эта ошибка.

Конец обновления

Любые предложения о том, как я могу получить это работает?

Спасибо.

+0

Что вы видите, когда вы устанавливаете скрытый в false? что происходит, когда вы запускаете командный файл из командной строки? – ths

+0

@ths Когда я начинаю с командной строки, командный файл работает на моем компьютере. Но когда я начал с процесса, он иногда работает, а иногда и нет. –

+0

"иногда"? выше, вы говорите «когда угодно». так в чем разница между рабочими и нерабочими прогонами? – ths

ответ

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 

PATH модифицирован после выполнения mingwvars.bat. Возможно, этот пакетный файл также изменяет PATH. Или он запускает команды вроде find.exe с исполняемыми файлами, ожидаемыми в %SystemRoot%\System32, но, возможно, также существующими в каталоге bin. Я уже несколько раз видел неработающие сценарии пакетного входа, так как PATH на клиентском компьютере содержал в качестве первого пути папки каталог компилятора, перенесенного из Unix в Windows, с исполняемыми файлами, также найденными в %SystemRoot%\System32, но работающими совершенно по-разному портированы из Unix.

Путь к папке должен быть добавлен к переменной окружения PATH всегда без двойных кавычек, даже если путь к папке содержит 1 или больше пробелов. Двойные кавычки, используемые в третьей строке, просто убедитесь, что конечное пространство не добавляется дополнительно к PATH, и эта команда set работает даже с не типичными путями папок, как амперсанд в пути.

И путь к папке должен быть добавлен к переменной окружения PATH без задней обратной косой черты.

При команде cd параметр /D дополнительно используется в случае изменения на другой привод, также должен быть выполнен. Команда cd не изменит текущий каталог, если указанный путь находится на другом диске без параметра /D.

В C# код вы должны убедиться, что workingDir, fileName и exeName, наконец, на выполнение cmd.exe, заключенное в двойные кавычки в строке аргументов, как Erti-Chris Eelmaa уже писал.

И было бы, возможно, лучше читать в приложении C# значение переменной окружения COMSPEC и использовать это значение, а не просто cmd для выполнения пакетного файла.

+0

Это работает на моем ПК! Я бы подождал, пока мои тестеры тоже проведут тест, прежде чем принять ответ. Спасибо Мофи! –

+0

Это тоже работает для тестировщиков. Я награду за награду за 5 часов. –

0

Это может быть или не быть частью проблемы, но вы не заботитесь о пространствах.

pStartInfo.Arguments = string.Join(" ", args); 

вы, вероятно, хотите что-то вроде этого:

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

Я уверен, что это не ошибка, потому что я могу получить ошибки, которые я отгоняю из пакета, которые видны в моем окне журнала. –

+0

В настоящее время вы регистрируете StandardError. Попытайтесь добавить журнал в StandardOutput и посмотрите, есть ли у вас что-то дополнительное. и посмотреть, можете ли вы воспроизвести «поведение» на других компьютерах. Что произойдет, если вы используете shell вместо CMD? Продолжается ли поведение, если вы вообще не скрываете окно? –

+0

Он работает на моем ноутбуке, но не на моем компьютере Dev, а также не на ноутбуках моего друга. –