2011-09-19 92 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#运行它。