インストーラの終了時に自動的にサービスを開始する

可能重複:
  インストール後に自動的にサービスを開始する方法

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
        }
    }
}

この関数は例外なく成功しますが、インストーラが終了してもサービスは実行されません。

イベントログにはサービスの起動に関連する障害は表示されず、サービスマネージャーに移動すると手動でサービスを開始できます(またはPCを再起動すると自動的に起動します)。

インストーラのプロセスが終了したら、自動的にサービスを開始するために何をする必要がありますか?

1
あなたがしたことがうまくいくように見えます。これをデバッグする可能性のあるトリック: Thread.Sleep を30秒程度の値で挿入してみてください。デバッガをサービスプロセスにアタッチすることができ、 Thread.Sleep の直後にブレークポイントを設定することができます。デバッガで一時停止すると、まだ再開時にエラーが発生した場合、それはタイミングの問題ではありません。その時点で、あなたのレジャーであなたのサービス状態を照会し、そのステップが何を問題の原因としているのかを判断することができます。 Thread.Sleep によって作業が開始される場合は、もちろんタイミングの問題です...
追加された 著者 Merlyn Morgan-Graham,
また、 "System.Diagnostics.Debugger.Launch();"を追加することもできます。開始メソッドの始めにデバッガを強制的にアタッチして、何がうまくいかないかを確認することができます。例外がどこかにあり、サービスが自動的に停止する可能性があります。
追加された 著者 user276648,

2 答え

AfterInstallイベントの使用

Service Installerクラスの AfterInstall イベントを作成し、 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();
}

Committedイベントを使用する

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,
Waitingは問題を解決しませんでした。インストーラはその待ち時間に掛かっていました。このサービスは、起動と停止を試みます。 Installer.Install の上に base.Install(savedState); を置きました。したがって、すべての依存関係のインストールが完了する前に、インストーラがサービスを開始しようとしていました。ベースコールをオーバーライドの一番下に移動することで、私はこの問題を解決しました。私が投稿したものから誰も見ることができなかったので、あなたは私を解決に導くので、あなたはポイントを得る。
追加された 著者 PaulH,
それが始まるまで待ってみましたか?私が投稿したリンクの例があります
追加された 著者 Andreas,