2011-09-19 53 views
1

我嘗試使用下面的C#代碼使用javac編譯Java:如何從C#編譯Java?

Process p = new Process(); 
p.StartInfo.FileName = "javac"; 
Directory.CreateDirectory(Application.StartupPath + @"/TempJava"); 
p.StartInfo.Arguments = "-d "Application.StartupPath + @"/TempJava" + files; 
p.Start(); 

「文件」表示包含*.java文件的姓名(或名稱)的字符串變量。總而言之,我想創建一個新文件夾,然後將Java文件(從它們可能位於的位置)取出並編譯到TempJava中的類文件中。

由於某些原因,代碼不起作用,沒有錯誤,沒有警告,但是當我運行它並檢查TempJava時,其中沒有任何文件。

+0

你的環境變量是什麼樣的?它們(特別是指向java編譯器的那個)是否正確? –

+0

是的,因爲我可以通過在命令提示符下手動輸入javac來運行javac,並且它工作正常。 – Alper

+0

另外,你在Unix上?斜槓意味着如此,所以沒有理由將其作爲原始字符串,儘管它是一條路徑。 –

回答

2

僅僅因爲您的子進程以可能的錯誤結束,並不意味着您的父進程必須意識到它。

檢查進程的退出代碼和標準輸出流,特別是標準錯誤流。你的答案在那裏...

+1

那麼如果你要提供一個答案,你可能還包括[Process.StandardError](http://msdn.microsoft.com/en-us/library/system。 diagnostics.process.standarderror.aspx) –

+0

正式注意。你的評論是第一個,所以它是相當明顯的,所以現在我會留下它。 –

+0

我應該如何閱讀標準錯誤流,以及我應該尋找的是什麼? – Alper

0

這裏我有2個按鈕運行和編譯這裏是一些代碼來幫助。

private void comp_Click(object sender, EventArgs e) 
    { 
     string text = "javac " + label1.Text + file + "@pause" + "@stop"; 
     text = text.Replace("@", System.Environment.NewLine); 

     File.WriteAllText(label1.Text + "Compile.bat", text); 

     Process proc = null; 
     try 
     { 
      proc = new Process(); 
      proc.StartInfo.FileName = label1.Text + "Compile.bat"; 
      proc.StartInfo.CreateNoWindow = false; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 
     catch 
     { 

     } 

    } 

    private void runp_Click(object sender, EventArgs e) 
    { 
     string news = file.Remove(file.Length - 5); 
     string text = "java " + news + "@pause"; 
     text = text.Replace("@", System.Environment.NewLine); 

     File.WriteAllText(label1.Text + "Run.bat", text); 

     Process proc = null; 
     try 
     { 
      proc = new Process(); 
      proc.StartInfo.FileName = label1.Text + "Run.bat"; 
      proc.StartInfo.WorkingDirectory = label1.Text.Remove(label1.Text.Length - 1); 
      proc.StartInfo.CreateNoWindow = true; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 
     catch 
     { 

     } 
    } 

我真正做的是創建一個批處理並使用c#運行它。