C# 从C控制台应用程序终止Java进程
我不久前就发布了这方面的信息,但我解决了另一个问题,又遇到了一个问题。我将要把这个程序部署到28台主机上,所以我想在我这么做之前确保它能正常工作 我编写了一个小小的c NET应用程序,它基本上是Java应用程序的包装器,当我的应用程序启动时,Java应用程序启动,当我的应用程序关闭时,它关闭,等等 除了关闭应用程序时,Java应用程序继续运行之外,其他一切都正常工作。创建流程时,我将流程变量存储在方法之外的变量中,然后在应用程序关闭时使用该变量。不管出于什么原因,尽管它没有终止Java应用程序C# 从C控制台应用程序终止Java进程,c#,java,.net,C#,Java,.net,我不久前就发布了这方面的信息,但我解决了另一个问题,又遇到了一个问题。我将要把这个程序部署到28台主机上,所以我想在我这么做之前确保它能正常工作 我编写了一个小小的c NET应用程序,它基本上是Java应用程序的包装器,当我的应用程序启动时,Java应用程序启动,当我的应用程序关闭时,它关闭,等等 除了关闭应用程序时,Java应用程序继续运行之外,其他一切都正常工作。创建流程时,我将流程变量存储在方法之外的变量中,然后在应用程序关闭时使用该变量。不管出于什么原因,尽管它没有终止Java应用程序
class Program
{
private static Process minecraftProcess;
public static void LaunchMinecraft(String file, String memoryValue)
{
String memParams = "-Xmx" + memoryValue + "M" + " -Xms" + memoryValue + "M ";
String args = memParams + "-jar " + file + " nogui";
ProcessStartInfo processInfo = new ProcessStartInfo("java.exe", args);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
try
{
//using (Process minecraftProcess = Process.Start(processInfo))
using (minecraftProcess = Process.Start(processInfo))
{
minecraftProcess.WaitForExit();
}
}
catch
{
// Log Error
}
}
static void Main(string[] args)
{
Arguments CommandLine = new Arguments(args);
// Hook ProcessExit Event
AppDomain.CurrentDomain.ProcessExit += new EventHandler(Current_ProcessExit);
if (CommandLine["file"] != null && CommandLine["memory"] != null)
{
// Launch the Application (Command Line Parameters)
LaunchMinecraft(CommandLine["file"], CommandLine["memory"]);
}
else
{
// Launch the Application (Default Parameters)
LaunchMinecraft("minecraft_server.jar", "1024");
}
}
static void Current_ProcessExit(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(10000);
// If we have an active Minecraft Service, Shut it down
if (minecraftProcess != null)
{
minecraftProcess.Kill();
}
}
}
您不能在ProcessExit处理程序中睡眠
各国:
所有操作的总执行时间
ProcessExit事件处理程序有限,
正如
所有终结器在进程中都受到限制
关闭。默认值为2秒。
非托管主机可以更改此设置
通过调用
ICLRPolicyManager::SetTimeout方法
使用OPR_ProcessExit枚举
价值观
您不能在ProcessExit处理程序中睡眠
各国:
所有操作的总执行时间
ProcessExit事件处理程序有限,
正如
所有终结器在进程中都受到限制
关闭。默认值为2秒。
非托管主机可以更改此设置
通过调用
ICLRPolicyManager::SetTimeout方法
使用OPR_ProcessExit枚举
价值观
无需担心,我刚刚意识到minecraftProcess变量是静态的。无需担心,我刚刚意识到minecraftProcess变量是静态的。不知道您是否没有自己解决此问题,但是: 您应该知道,对于返回bool的实例和返回对象的static实例,都有Start方法 除了使用局部变量,您不应该使用其他东西 这应该很好:
minecraftProcess = Process.Start(processInfo)
minecraftProcess.WaitForExit();
不知道您是否没有自己解决此问题,但是: 您应该知道,对于返回bool的实例和返回对象的static实例,都有Start方法 除了使用局部变量,您不应该使用其他东西 这应该很好:
minecraftProcess = Process.Start(processInfo)
minecraftProcess.WaitForExit();
如果你在minecraftProcess.Kill行上设置断点,它会在那里中断吗?如果它确实执行,那么它执行得是否干净,也就是说,没有例外,它看起来像进程minecraftProcess为空。有没有更好的方法可以使用它呢?实际上它看起来像进程的返回值。Start是一个布尔值,而不是实际的进程本身,所以现在有意义了。你知道我怎么能得到我创建的ID,因为我将有一个以上的运行?你有没有考虑在同一个过程中运行JVM?使用JNI或IKVM都有效。如果在minecraftProcess.Kill行上设置断点,它会在那里中断吗?如果它确实执行,那么它执行得是否干净,也就是说,没有例外,它看起来像进程minecraftProcess为空。有没有更好的方法可以使用它呢?实际上它看起来像进程的返回值。Start是一个布尔值,而不是实际的进程本身,所以现在有意义了。你知道我怎么能得到我创建的ID,因为我将有一个以上的运行?你有没有考虑在同一个过程中运行JVM?使用JNI或IKVM都有效。是的,我只是在其中添加了它,看看是否可以延长它并打印出一些值。我最初提到的问题仍然存在,不管我是否睡觉。是的,我只是在那里添加了这个问题,看看是否可以延长它并打印出一些值。不管我睡不睡,我最初提到的问题仍然存在。