Автоматично запускати службу після завершення інсталяції

Можливі дублікати :
   Як автоматично запустити службу після встановлення?

У мене є проект інсталятора сервісів Visual Studio 2008 C# .NET 3.5 (MSI), запущений на Windows 7 x64.

Я підписуюся на повідомлення ServiceInstaller.OnAfterInstall , щоб почати моє обслуговування після завершення інсталяції.

[RunInstaller(true)]
public partial class MyInstaller : Installer
{
    private System.ServiceProcess.ServiceInstaller my_installer_;

    private void InitializeComponent()
    {
       //...
        this.my_installer_.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.OnAfterInstall);
       //...
    }

    private void OnAfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController svc =
            new System.ServiceProcess.ServiceController("MyService"))
        {
            svc.Start();//completes successfully
        }
    }
}

Незважаючи на те, що функція успішно виконується без винятку, моя служба ніколи не запускається після завершення інсталяції.

Журнал подій не показує жодних помилок, пов'язаних із запуском служби, і якщо я звернуся до менеджера послуг, я можу запустити сервіс вручну (або перезапустити комп'ютер, і він запуститься автоматично).

Що потрібно зробити, щоб автоматично запустити службу після завершення процесу встановлення?

1
Схоже, те, що ви зробили, має працювати. Можливий трюк для налагодження: Спробуйте вставити Thread.Sleep із значенням 30 секунд або близько того. Це може дозволити вам приєднати відладчик до процесу обслуговування, і ви можете встановити точку розриву відразу після Thread.Sleep . Як тільки ви призупиняєтеся в відладчику, якщо ви все ще отримуєте помилки на резюме, то це не річ часу. На цьому етапі ви можете отримати запит у своєму стані служби на дозвіллі і визначити, що про цей крок викликає проблему. Якщо Thread.Sleep призводить до початку роботи, це, звичайно, річ часу ...
додано Автор Merlyn Morgan-Graham, джерело
Також можна додати "System.Diagnostics.Debugger.Launch ();" на початку методу запуску, щоб змусити приєднати відладчик, щоб можна було перевірити, що відбувається неправильно. Можливо, десь є виняток, і ваш сервіс просто зупиняється автоматично.
додано Автор user276648, джерело

2 Відповіді

Використання події AfterInstall

Створіть подію AfterInstall у класі Service Installer і запустіть службу за допомогою ServiceController .

public ServiceInstaller()
{
    InitializeComponent();
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

Використання події

public ServiceInstaller()
{
    InitializeComponent();
    this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
}

void ProjectInstaller_Committed(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

Or you can override OnCommitted event

    protected override void OnCommitted(System.Collections.IDictionary savedState)
    {
        base.OnCommitted(savedState);
        new ServiceController(serviceInstaller1.ServiceName).Start();
    }

Окрім зазначених вище, перевірте наступне

  • Тип запуску інсталятора: автоматичний
  • Обліковий запис: локальна система

Крім інсталятора послуг, вам потрібно мати проект установки, який створюється, надаючи первинний вихід вищезгаданого інсталятора послуг.

enter image description here

у налаштуваннях створюйте користувацьку дію, принаймні, на встановлення, надаючи висновку проекту інсталятора служби.

enter image description here

Більш детальну інформацію можна отримати за адресою

1
додано
Хіба це не те, що я зробив?
додано Автор PaulH, джерело
@ PaulH Будь ласка, перевірте мою оновлену відповідь. Він працює добре для мене з вищевказаними налаштуваннями.
додано Автор Damith, джерело

I assume that Start returns immediatly, and Starts the Service in the background. Check the Docs: http://msdn.microsoft.com/en-us/library/yb9w7ytd.aspx

0
додано
Так, я впевнений, що це так. Це не пояснює, чому служба не запущена або як правильно її запустити.
додано Автор PaulH, джерело
Очікування не виправили проблему - установка висіла на цьому очікуванні. Служба буде намагатися запустити і не виконати. Я мав base.Install (savedState); у верхній частині мого Installer.Install перевизначення. Отже, інсталятор намагався запустити службу, перш ніж закінчила встановлення всіх залежностей. Пересуваючи виклик бази на дно мого перевизначення, я вирішив проблему. Не те, що хтось міг би бачити з того, що я відправив, так що ви отримаєте очки, тому що ви привели мене до рішення.
додано Автор PaulH, джерело
Ви намагалися чекати, поки вона не розпочнеться? У наведеному мною посиланні є приклад
додано Автор Andreas, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug