.Net Windows Service не запускается - PullRequest
1 голос
/ 18 апреля 2011

Я занимаюсь разработкой самоустанавливающейся службы 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 в конструкторе. Это было уже исправлено; теперь нет новых ошибок в журнале событий, но проблема сохраняется.

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

Вы упоминаете, что текст "Test3" записывается в файл при установке или удалении службы. Вместо того, чтобы писать «Test3» в файл, напишите tw.WriteLine(ex.Message);, чтобы увидеть, что является конкретным исключением.

1 голос
/ 18 апреля 2011

Судя по всему, вам нужно запустить поток, который запускает службу.

Thread t = new Thread(new ThreadStart(InitService));
t.Start();
0 голосов
/ 18 апреля 2011

Я наконец нашел проблему.

лежит в ServiceManager; когда я устанавливал сервис из IDE, он получал имя исполняемого файла MyService.vshost.exe вместо MyService.exe.

Я нашел это чтение по следующей ссылке,

http://www.c -sharpcorner.com / UploadFile / timosten / DynamicServiceInCSharp11262005062503AM / DynamicServiceInCSharp.aspx

ищет ключи реестра, которые он писал:

//Open the HKEY_LOCAL_MACHINE\SYSTEM key
system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
//Open CurrentControlSet
currentControlSet = system.OpenSubKey("CurrentControlSet");
//Go to the services key
services = currentControlSet.OpenSubKey("Services");

Большое спасибо всем, кто пытался помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...