Уничтожение Java-процесса из консольного приложения C # - PullRequest
0 голосов
/ 18 января 2011

Я ненавижу публиковать об этом снова, но я ответил на свой последний пост, думая, что я исправил это (что я не сделал).В основном, когда мое приложение c # .NET закрывается, я хочу удалить запущенный Java-процесс, который он создал.Первоначальная проблема заключалась в том, что я пытался сохранить processID в статической переменной члена класса (которая, очевидно, не работала).Я нашел пример Global Class в сети и использовал его вместо этого, однако он все еще не останавливает процесс.Я предполагаю, что он просто создает новый экземпляр приложения, а не запускает тот, который я создал, и даже установка рабочего каталога в каталог "Bin" не работает.Поэтому сейчас мне просто нужно запустить .exe из каталога Bin.

namespace MinecraftDaemon
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting Minecraft Daemon...");

            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");
            }
        }

        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))
                {
                    GlobalClass.ProcessID = minecraftProcess.Id;
                    Console.WriteLine("Process ID is " + GlobalClass.ProcessID);
                    minecraftProcess.WaitForExit();
                }
            }
            catch
            {
                // Log Error
            }
        }

        static void Current_ProcessExit(object sender, EventArgs e)
        {
            // Loop the Current Windows Processes
            foreach (Process winProcess in Process.GetProcesses())
            {
                Console.WriteLine("WinProcessID is " + winProcess.Id + " GlobalClass.ProcessID is " + GlobalClass.ProcessID);

                // If this is our Process, shut it down
                if (winProcess.Id == GlobalClass.ProcessID)
                {
                    Process.GetProcessById(GlobalClass.ProcessID).Kill();
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 января 2011

Это было решено путем переключения с перехвата Event AppDomain.CurrentDomain.ProcessExit на использование SetConsoleCtrlHandler ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...