Я хотел бы перенести программу Java на службу окон с использованием C# System.ServiceProcess.ServiceBase
. Таким образом, я придумал следующий код:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
System.ServiceProcess.ServiceBase.Run(new JavaLauncher());
}
protected override void OnStart(string[] args)
{
Thread _thread;
_thread = new Thread(StartService);
_thread.Start();
base.OnStart(args);
}
protected override void OnStop()
{
Thread _thread;
_thread = new Thread(StopService);
_thread.Start();
base.OnStop();
}
static public void StartService()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "javaw";
proc.StartInfo.Arguments = config.generateLaunchCommand();
proc.Start();
}
static public void StopService()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "javaw";
proc.StartInfo.Arguments = "-jar stop.jar";
proc.Start();
}
Во-первых я должен был использовать Потоки в OnStart и OnStop. В противном случае исключение происходит, жалуясь, что сервис завершается из-за выполнения ничего.
Во-вторых, сервис может быть сцеплен до окон гладко. Однако сервис завершает короткое время после того, как он будет запущен. Я изучил монитор процесса, только сервисный процесс остается в живых в течение того короткого времени, процесс javaw никогда не обнаруживался, как бы то ни было. Есть ли кто-либо, кто знает, как это может быть зафиксировано?
Это хорошо работает в обычной консольной среде. Я думаю, что это имеет некоторое отношение к службе Windows.
То, что процесс Java не отображается, не означает, что он не запускался. Он мог запуститься и сразу выключиться. Попробуйте перенаправить stdout / stderr, чтобы увидеть, что происходит.
Также переменная proc в методах StartService и stopservice является локальной переменной. Когда он выходит за пределы области видимости, ваш объект процесса собирается сборщиком мусора. Интересно, приводит ли это к тому, что ваш Java-процесс умирает
Я бы порекомендовал вам использовать решение с открытым исходным кодом.
См. Этот пост Как создать службу Windows из приложения java
Я бы предложил использовать это http://sourceforge.net/projects/yajsw/