我最近问过这样的问题,但它已经解决了(有点)....
基本上我发现我可以启动一个java进程,如果它只是一个程序启动它。但这并不是我的项目所需要的。
这就是我想要它做的......
Project1.exe ---开始 - > Project2.exe ---开始 - > somejar.jar
按照上面的说明,我当前的project1使用以下内容启动project2,
process = new Process();
process.StartInfo.FileName = Path.Combine(storage, "project2.exe");
process.Start();
然后project2.exe通过cmd使用以下命令启动java应用程序,
miner = new Process();
miner.StartInfo.FileName = "cmd.exe";
miner.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
miner.StartInfo.Arguments = "/K java -cp libs\\*;DiabloMiner.jar -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u " + this.user + " -p " + this.password + " -o " + this.server;
miner.Start();
好的,结果是没有像它想象的那样启动矿工*。但这不是它的结束......接下来发生的事情也很有趣......
我有以下while循环(见下文,project1的一部分),以确保我的project2(见上文)从未停止,因此它可以继续挖掘。
while (true)
{
if (process == null)
{
process = new Process();
process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
process.Start();
}
else
{
if (process.HasExited)
process = null;
}
Thread.Sleep(300);
}
结果表明,process.HasExited *(如代码块正上方所示)返回true,当我请求miner *的启动时,它再次启动进程(如上所示)。但是,当我检查进程是否仍在任务管理器中运行时,它仍然使用cpu并且仍然正常运行(它响应ping)。
所以这个问题有两个问题。
1)如何正确启动一个c#程序,启动另一个c#程序(从不假设关闭),它通过cmd启动java .jar?
2)它调用时究竟发生了什么.HasExited因为它看起来并没有真正退出......这是Project1循环的一个问题。 (好吧,我发现了这个,Process.HasExited returns true even though process is running?所以不要担心,我会尝试解决方法)
我知道很多过程都是感谢您尝试提供帮助。
答案 0 :(得分:1)
Project2生成一个新进程,然后完成,所以进程退出。你应该等待矿工:
miner.WaitForExit();
另外,在Project1中,我建议你将while循环更改为:
while(true)
{
process = new Process();
process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
process.Start();
process.WaitForExit();
}
这应该在功能上相同,但通常被认为更清洁。
编辑:
我不知道为什么Project2无法启动jar,但这至少应该为你提供矿工的所有输出:
miner = new Process{
StartInfo = new ProcessStartInfo {
FileName = "java.exe",
Arguments = "-cp \"libs\\*;DiabloMiner.jar\" -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u '" + this.user + "' -p '" + this.password + "' -o '" + this.server + "'",
WorkingDirectory = Directory.GetCurrentDirectory();
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
}
};
miner.Start();
miner.WaitForExit();
string output = miner.StandardOutput.ReadToEnd();
string error = miner.StandardError.ReadToEnd();
// Display "output" and "error" however you like
如果miner
现在崩溃,error
中应该会有一些错误消息告诉我们出了什么问题。
这假设this.user
,this.password
和this.server
都不包含'
。