从C#Console应用程序中杀死Java进程

时间:2011-01-18 00:22:33

标签: c# java .net

我刚刚发布了这个帖子,但是我解决了另一个问题,又遇到了另外一个问题。我即将把这个程序部署到28个托管机器上,所以我想在我这样做之前确保它正常工作。

我写了一个小的c#NET应用程序,它基本上是Java应用程序的包装器,当我的应用程序启动,Java应用程序启动,应用程序关闭,关闭等等。

一切正常,但是当我关闭应用程序时,Java应用程序继续运行。当我创建进程时,我将Process var存储在方法之外的变量中,然后在我的应用程序进入关闭时使用它。无论出于何种原因,它都没有终止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();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

Sleep处理程序中无法ProcessExit

documentation州:

  

所有人的总执行时间   ProcessExit事件处理程序有限,   就像总的执行时间一样   所有终结者在过程中都是有限的   关掉。默认值为两秒。   非托管主机可以更改此设置   通过调用执行时间   ICLRPolicyManager :: SetTimeout方法   使用OPR_ProcessExit枚举   值。

答案 1 :(得分:0)

没关系,我刚刚意识到minecraftProcess变量是静态的。

答案 2 :(得分:0)

不知道你是否自己没有解决这个问题,但是:

  • 您应该知道实例(返回bool)和静态(返回对象)有 Start 方法。

  • 你不应该使用使用而不是使用局部变量!

这应该可以正常工作:

minecraftProcess = Process.Start(processInfo)
minecraftProcess.WaitForExit();