2011-01-18 3 views
0

Мне не нравится публиковать об этом еще раз, но я ответил на свое последнее сообщение, думая, что я исправил его (чего я не сделал). В основном, когда мое приложение C# .NET закрывается, я хочу удалить запущенный процесс Java, который он создал. Первоначальная проблема заключалась в том, что я пытался сохранить processID в статическую переменную-член класса (которая, очевидно, не работала). Я нашел пример глобального класса в Интернете и использовал это вместо этого, однако он все еще не закрывает процесс.Killing Java Process from C# Приложение консоли

Отладка не работает должным образом. Я предполагаю, что он просто создает новый экземпляр приложения, а не запускает тот, который я создал, и даже установка рабочего каталога в каталог «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(); 
       } 
      } 
     } 
    } 
} 
+0

Получает ли ваш код 'WriteLine' в' Current_ProcessExit'? – casablanca

+0

Некоторые Java-приложения не будут изящно покидать (если есть потоки не-демона, которые отказываются останавливаться), так что это может быть одной из причин, почему это не работает. – biziclop

+0

@biziclop: Можете ли вы предоставить ссылки на это заявление, пожалуйста? Мне любопытно. :) – Davidann

ответ

0

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

Смежные вопросы