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

Possible Duplicate:
How to automatically start your service after install?

У мяне ёсць праект 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();
    }

Акрамя вышэй, калі ласка, праверце наступнае

  • Тып ўстаноўкі Старт: Аўтаматычны
  • Account: Лакальная сістэма

Акрамя ўсталёўшчыка службы неабходна мець налады праект, які створаны шляхам прадастаўлення першаснага выхаду вышэй ўсталёўшчыка службы.

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, крыніца