2013-07-26 4 views
5

Ich schrieb ein Programm, das Dateien mit csc.exe meine CS- kompiliert:Erwartetes Verhalten mit weißen Raum in der Kommandozeile

namespace myCompiler 
{ 
    public partial class Form1 : Form 
    { 
     string compilerFolder; 
     string outputFolder; 
     string projectFile; 
     string output = @" /out:"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void startCompile_Click(object sender, EventArgs e) 
     { 
      Compile(); 
     } 

     public void findCompile_Click(object sender, EventArgs e) 
     { 
      DialogResult result1 = folderBrowserDialog1.ShowDialog(); 
      compilerFolder = folderBrowserDialog1.SelectedPath; 
      MessageBox.Show(compilerFolder); 
      cscLabel.Text = compilerFolder; 
     } 

     private void outputCompile_Click(object sender, EventArgs e) 
     { 
      DialogResult result2 = folderBrowserDialog2.ShowDialog(); 
      outputFolder = folderBrowserDialog2.SelectedPath; 
      outputLabel.Text = (outputFolder); 
      MessageBox.Show(outputFolder); 
     } 

     private void findProject_Click(object sender, EventArgs e) 
     { 
      if (openFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       projectFile = openFileDialog1.FileName;     
       projectLabel.Text = (projectFile); 
       MessageBox.Show(projectFile); 
      } 
     } 

     public void Compile() 
     { 
      try 
      { 
       Process compile = new Process(); 

       string outputExe = fileName.Text; 
       string compiler = compilerFolder + @"\csc.exe"; 
       string arGs = output + outputFolder + @"\" + outputExe + " " + projectFile; 

       compile.StartInfo.FileName = (compiler); 
       compile.StartInfo.Arguments = (arGs); 
       compile.StartInfo.RedirectStandardOutput = true; 
       compile.StartInfo.UseShellExecute = false; 
       compile.Start(); 

       string stdOutput = ""; 
       while (!compile.HasExited) 
       { 
        stdOutput += compile.StandardOutput.ReadToEnd(); 
        MessageBox.Show(stdOutput); 
       } 
      } 

      catch (Exception errorMsg) 
      { 
       MessageBox.Show(errorMsg.Message); 
      } 
     } 

     private void testButton_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show(projectFile); 
      MessageBox.Show(compilerFolder); 
     } 
    } 
} 

Die Kompilierung Anweisung läuft, erzeugt aber keine Ergebnisse, nur einen schnellen Blitz eines schwarzen Konsolenbildschirm.

Im Grunde, was passiert zu sein scheint, ist, wenn alle Saiten in der Kommandozeile als Argumente für den Prozess analysiert werden, wird das CS-Projektquellverzeichnis von jedem weißen Raum dh c:\users\%username%\Documents\Visual Studio 2010\ aufgebrochen wird aufgebrochen, wie c:\users\%username%\Documents\Visual then Studio dann 2010\Projects\Myproject\myproj.cs

und anschließend schlägt die Kompilierung.

+1

Sie benötigen doppelte Anführungszeichen um einen Dateipfad mit Leerzeichen. –

+0

Wenn Sie wirklich können schreiben müssen ein Bild dann poste den Link und andere Benutzer Ihre Post bearbeiten und den Link in das Bild ändern :) Sie scheinen beschrieben Ihr Problem genug zu haben, obwohl – Sayse

+0

Programme zu kompilieren ist eine integrierte Funktion von .NET , verwenden Sie den System.CodeDom-Namespace. –

Antwort

3

Sie müssen doppelte Anführungszeichen um einen Dateipfad mit Leerzeichen.

Siehe meine Bearbeitung zu Ihrem Code unten.

public void Compile() 
{ 
    try 
    { 
     Process compile = new Process(); 

     string outputExe = fileName.Text; 
     string compiler = compilerFolder + "\csc.exe"; 

     // add double quotes around path with spaces in it. 
     string arGs = output + "\"" + outputFolder + "\"" + @"\" + outputExe + " " + projectFile; 

     compile.StartInfo.FileName = compiler; 
     compile.StartInfo.Arguments = arGs; 
     compile.StartInfo.RedirectStandardOutput = true; 
     compile.StartInfo.UseShellExecute = false; 
     compile.Start(); 

     string stdOutput = ""; 
     while (!compile.HasExited) 
     { 
      stdOutput += compile.StandardOutput.ReadToEnd(); 
      MessageBox.Show(stdOutput); 
     } 
    } 

    catch (Exception errorMsg) 
    { 
     MessageBox.Show(errorMsg.Message); 
    } 
} 
+0

Dank Sam das Präfix „\“ „und dem Zusatz‚\‘“ der Trick, kann nicht glauben, dass ich verpasst, dass wie zu sehen ist, wie der CLI einen langen Namen wie das lesen würde. Aber A + dafür, vielen Dank! In Zukunft werde ich tun dies für alle Zeichenfolgen, die Pfade enthalten. –