Я занимаюсь разработкой самоустанавливающейся службы Windows. У меня есть класс ServiceManager, который обрабатывает установку / удаление и, кажется, работает правильно.
Однако, когда я пытаюсь запустить службу, которую я получаю, немедленно , MessageBox со следующим текстом:
Не удалось запустить службу на локальном
система. Ошибка 1053: служба не отвечает на
запрос запуска или управления в
своевременная мода.
Код моей услуги:
public partial class MyService : ServiceBase
{
public MyService()
{
using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
{
tw.WriteLine("Test1");
tw.Close();
}
InitializeComponent();
}
protected override void OnStart(string[] args)
{
using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
{
tw.WriteLine("Test2");
tw.Close();
}
Thread t = new Thread(new ThreadStart(InitService));
t.Start();
}
protected override void OnStop()
{
}
static void InitService()
{
using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
{
tw.WriteLine("Test4");
tw.Close();
}
while (true)
{
Thread.Sleep(100);
}
}
Код конструктора:
namespace MyService
{
partial class MyService
{
/// <summary>
/// Variable del diseñador requerida.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Limpiar los recursos que se estén utilizando.
/// </summary>
/// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Código generado por el Diseñador de componentes
/// <summary>
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "MyService";
}
#endregion
}
}
My Main:
public static void Main(string[] args)
{
try
{
bool debug = false;
bool mustRun = false;
string errMsg = "";
mustRun = true;
using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
{
tw.WriteLine("Test3");
tw.Close();
}
ServiceManager manager = new ServiceManager();
mustRun = !manager.ParseArgs(args, ref debug, ref errMsg);
MyService svc = new MyService();
//
// if (debug)
// {
// svc.DebugStart();
// }
// else
if (mustRun)
{
System.ServiceProcess.ServiceBase[] ServicesToRun = null;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { svc };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
else
{
}
}
catch (Exception ex)
{
using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
{
tw.WriteLine(ex.Message);
tw.Close();
}
}
}
Файл C: \ Test.txt не записывается, за исключением случаев установки или удаления службы (со строкой Test3). Я использую Windows XP, поэтому не должно быть проблем с разрешениями.
Я попытался установить службу с учетной записью System и NetworkService, и возникла та же проблема.
С учетной записью администратора это дает мне еще одну ошибку, связанную с учетной записью (я думаю, это потому, что у меня нет пароля).
Есть идеи о том, что происходит?
Обновление: Отвечая на вопрос Дэвида, вот что говорит журнал событий (ручной перевод, английское сообщение может быть другим):
Служба не может быть запущена. Сервис
процесс не может соединиться с сервисом
контроллер. * * один тысяча тридцать три
Обновление 2: Если присмотреться к журналу Applicatin более внимательно, предыдущая ошибка была вызвана несоответствием между именем установки службы и свойством ServiceName в конструкторе. Это было уже исправлено; теперь нет новых ошибок в журнале событий, но проблема сохраняется.