Сначала я бы добавил некоторые возможности для отладки. Это на самом деле легко (когда ты умеешь !!!).
Добавьте это к вашему классу:
[DllImport("kernel32.dll")]
public static extern Int32 AllocConsole();
Затем добавьте это в свою основную функцию (и вы МОЖЕТЕ сделать это тоже при работе в качестве службы, если вы разрешаете службе доступ к пользовательскому интерфейсу).
for (int loop = 0; loop < args.Count; loop++)
{
if (args[loop] == "debug")
AllocConsole();
}
Это дает вам консольное окно, и вы можете использовать Console.WriteLine для отправки вывода на него сейчас. Yummy.
Теперь вы хотите, чтобы диспетчер управления службами вызвал ваш метод OnStart, а затем этот метод должен ВЕРНУТЬ сигнал OK, чтобы SCM узнал, что ваше приложение запущено нормально. В противном случае SCM считает, что что-то не так, и убивает ваше приложение. Так что OnStart должен запускать ваши темы. Итак, создайте метод Run (), который будет запускаться вашим потоком (и Main), и заставить OnStart возвращать как можно быстрее.
Я заметил, что ничего не вижу в вашем примере кода:
System.ServiceProcess.ServiceBase [] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase [] {new WinService1 ()};
System.ServiceProcess.ServiceBase.Run (ServicesToRun);
Я подозреваю, что ваше приложение не сообщает SCM, что оно успешно запустило "службу", которая находится внутри вашего исполняемого файла.
Вы хотите, чтобы ваше приложение запустилось, передайте «службу» SCM и сообщите, что с вами все в порядке, а затем вернитесь, пока ваша служба теперь работает со своим собственным потоком.
См. Эту статью для большой прогулки по:
http://msdn.microsoft.com/en-us/library/aa984464(v=vs.71).aspx