2016-07-30 7 views
0

J'utilise Windows 10.windres: Le nom de fichier, nom de répertoire ou la syntaxe d'étiquette de volume est incorrect

Je suis en train de compiler un C++ fichier à l'intérieur C# en utilisant MinGW (le dossier MinGW est dans le répertoire des projets), mais il ne compilera pas de script de ressources (en utilisant windres). Chaque fois que j'utilise windres dans cmd, il est écrit: "C: /Users/username/AppData/Local/Temp/my.rc: 1: séquence d'échappement non reconnue". mais fonctionne toujours. Mais lorsque j'exécute exactement la même commande via C# (en créant un processus) cela ne fonctionne pas du tout et dit: "Le nom du fichier, le nom du répertoire ou la syntaxe de l'étiquette de volume est incorrect.".

Mon code:

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

Les arguments il passe à cmd sont: /c "MinGW \ bin \ windres.exe" -o "C: /Users/easyc/AppData/Local/Temp/my.o" « C:/Utilisateurs/easyc/AppData/Local/Temp/my.rc " – Yaron

+0

Cela ne peut fonctionner que lorsque vous définissez ProcessStartInfo.WorkingDirectory pour qu'il puisse trouver le sous-répertoire MinGW de manière fiable. Toujours favoriser les noms de chemin complet, c: \ foo \ bar \ baz.ext –

+0

J'ai ajouté dans ce peu de code: si (! File.Exists (gccLocation + @ "windres.exe")) MessageBox.Show (" windres n'existe pas "); sinon MessageBox.Show ("windres exists."); et la boîte de message dit "windres existe". – Yaron

Répondre

0

Nous avons fini à l'aide d'un fichier batch pour exécuter la commande.

   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();