Я хотел бы обернуть Java-программу в службу Windows с 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();
}
Сначала я должен был использовать Threads в OnStart и OnStop. Если нет, возникает исключение, в котором говорится, что служба прекращена из-за отсутствия действий.
Во-вторых, сервис можно плавно подключить к окнам. Однако служба завершает работу через некоторое время после запуска. Я посмотрел на монитор процесса, только сервисный процесс остается активным в течение этого короткого времени, однако процесс javaw так и не появился. Кто-нибудь знает, как это можно исправить?
Отлично работает в обычной консольной среде. Я думаю, что это как-то связано со службой Windows.