C# 从C控制台应用程序终止Java进程

C# 从C控制台应用程序终止Java进程,c#,java,.net,C#,Java,.net,我不久前就发布了这方面的信息,但我解决了另一个问题,又遇到了一个问题。我将要把这个程序部署到28台主机上,所以我想在我这么做之前确保它能正常工作 我编写了一个小小的c NET应用程序,它基本上是Java应用程序的包装器,当我的应用程序启动时,Java应用程序启动,当我的应用程序关闭时,它关闭,等等 除了关闭应用程序时,Java应用程序继续运行之外,其他一切都正常工作。创建流程时,我将流程变量存储在方法之外的变量中,然后在应用程序关闭时使用该变量。不管出于什么原因,尽管它没有终止Java应用程序

我不久前就发布了这方面的信息,但我解决了另一个问题,又遇到了一个问题。我将要把这个程序部署到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都有效。是的,我只是在其中添加了它,看看是否可以延长它并打印出一些值。我最初提到的问题仍然存在,不管我是否睡觉。是的,我只是在那里添加了这个问题,看看是否可以延长它并打印出一些值。不管我睡不睡,我最初提到的问题仍然存在。