2016-07-30 3 views
0

Я использую окна 10.windres: имя файла, имя каталога, или синтаксис метки тома неправильно

Я пытаюсь скомпилировать файл C++ в C# с использованием MinGW (папка MinGW находится в директории проекта), но он не будет компилировать сценарий ресурсов (используя windres).

Когда я использую windres в cmd, он говорит: «C: /Users/username/AppData/Local/Temp/my.rc: 1: непризнанная escape-последовательность». но все еще работает. Но когда я запускаю ту же самую команду через C# (создавая процесс), она вообще не работает и говорит: «Имя файла, имя каталога или синтаксис метки тома неверны».

Мой код:

String tempDir = Path.GetTempPath(); 
String file = tempDir + "my.rc"; 

using (StreamWriter writer = new StreamWriter(file, false, Encoding.ASCII)) 
{ 
    if (!textIcon.Text.Equals("")) 
     await writer.WriteLineAsync("25 ICON \"" + textIcon.Text + "\""); 
    if (checkAdmin.Checked) 
    { 
     String manifest = tempDir + @"\manifest.xml"; 
     createManifest(manifest); 
     await writer.WriteLineAsync("55 24 \"" + manifest + "\""); 
    } 
} 

String args2 = "/c \"" + Path.Combine(gccLocation, "windres.exe") + "\" -o \"" + Path.Combine(tempDir, "my.o").Replace("\\", "/") + "\" \"" + file.Replace("\\", "/") + "\""; 

//Debug 
//args2 = "/k echo " + args2; 

ProcessStartInfo psi2 = new ProcessStartInfo(); 
psi2.FileName = "CMD.exe"; 
psi2.Arguments = args2; 
psi2.UseShellExecute = false; 
psi2.CreateNoWindow = true; 

//Debug 
//psi2.CreateNoWindow = false; 

Process windres = Process.Start(psi2); 
windres.WaitForExit(); 

if(windres.ExitCode != 0) 
{ 
    MessageBox.Show("Error: Could not create resource file (" + windres.ExitCode + ")"); 
} 
+0

аргументы она проходит в ЦМД: /с "MinGW \ Bin \ windres.exe" -o "C: /Users/easyc/AppData/Local/Temp/my.o" «C:/Пользователи/easyc/AppData/Local/Temp/my.rc « – Yaron

+0

Это может работать только последовательно, когда вы устанавливаете ProcessStartInfo.WorkingDirectory, чтобы он мог надежно найти подкаталог MinGW. Всегда предпочитайте имена полного пути, c: \ foo \ bar \ baz.ext –

+0

Я добавил в этот бит кода: if (! File.Exists (gccLocation + @ "windres.exe")) MessageBox.Show (" windres не существует "); еще MessageBox.Show ("windres exists."); и в окне сообщений указано «windres exists». – Yaron

ответ

0

Законченное используя пакетный файл для запуска команды.

   String args2 = "windres.exe -i \"" + Path.GetFullPath(file) + "\" -o \"" + Path.Combine(tempDir, "my.o") + "\"" ; 

       using (StreamWriter writer = new StreamWriter(tempDir + @"\my.bat", false, Encoding.ASCII)) 
       { 
        await writer.WriteLineAsync("@echo off"); 
        await writer.WriteLineAsync("cd " + Path.GetFullPath(gccLocation)); 
        await writer.WriteLineAsync(args2); 
       } 

       //Debug 
       //args2 = "/k echo " + args2; 

       ProcessStartInfo psi2 = new ProcessStartInfo(); 
       psi2.FileName = tempDir + @"\my.bat"; 
       psi2.UseShellExecute = false; 
       psi2.CreateNoWindow = true; 

       //Debug 
       //psi2.CreateNoWindow = false; 

       Process windres = Process.Start(psi2); 
       windres.WaitForExit(); 
Смежные вопросы