2009-06-18 14 views

答えて

1

依存関係を指定する必要があります。インストーラクラスでこれを行うことができます。

あなたはあなたのサービスをインストールするには、セットアッププロジェクトにカスタムアクションとしてインストーラクラスを使用する必要があります

さらに明確化。もしあなたがいないのであれば、コメントを投稿してください。この回答を更新する方法を説明します。

インストーラクラスのデザイナには、serviceInstallerとserviceProcessInstallerという2つのコンポーネントがあります。私は頭の中のどの部分が覚えていないのかを覚えていませんが、これらのうちの1つに、サービスの依存関係のサービス名を列挙する複数行の文字列を指定できるプロパティがあります。

+0

あなたは何を意味するのでしょうか?これはどうすれば私を助けますか? Thanks –

+0

ServiceInstaller(http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx)クラスを使用してサービスをインストールする場合、ServicesDependedOnプロパティを使用して依存関係を追加できます。 – adrianbanks

3

私はあなたがこの行は

installer.ServicesDependedOn =新しい文字列[] { "DependenceService"} shoudと思います。このような

using (ServiceProcessInstaller processInstaller = new ServiceProcessInstaller()) 
{ 
    processInstaller.Account = ServiceAccount.LocalSystem; 
    processInstaller.Username = null; 
    processInstaller.Password = null; 

    using (ServiceInstaller installer = new ServiceInstaller()) 
    { 
     installer.DisplayName = "yourservice."; 
     installer.StartType = ServiceStartMode.Automatic; 
     installer.ServiceName = "YourService"; 

     installer.ServicesDependedOn = new string [] { "DependenceService" }; 
     this.Installers.Add(processInstaller); 
     this.Installers.Add(installer); 
    } 
} 

幸運

+0

サービスが開始されると自動的に依存サービスが開始されますが、サービスは既に実行されても自動的に開始されません。そしてそれは私がそれを理解したように問題でした。 – devdimi

+0

ops ...もし私がこの問題を忘れてしまったら、すみません。 – Jonathan

+0

私はこれをきれいな解決策として知っていますが、回避策としてN秒ごとに希望するサービスの状態を確認できます。 ServiceController Name = new ServiceController(); byServiceName.ServiceName = "ServiceWanted"; 、その後: (name.Status == ServiceControllerStatus.Running) – Jonathan

0

あなたが他のサービスに対する制御を持っていますか? もしそうなら、彼らがあなたを始めさせるでしょう。そうでなければ、とにかく始めて何が起こっているのか自分自身を監視しなければならないと思います。 他のプロセスが開始されたときに通知するためにWMIに自分自身を登録することができます。

+0

Windowsへのサービスの依存関係を指定する方法があるため、他のサービスの起動が完了するまでサービスの開始を試みません。 – Bevan

+0

しかし、他のサービスが既に稼動しているときにサービスを開始したい場合には役に立ちません。それは問題だと思います。 – devdimi

+0

@dev:どうしたらいいですか?依存関係とスタートアップの種類を[自動]に設定します。 –

3

これらのサービスの1つがSQL Serverである場合、特定のデータベースとSQL Serverサービス自体が利用可能であることを確認する必要があります。プロジェクトインストーラーas described hereを追加し、あなたのサービスのプロジェクトで

public class DbStatus 
{ 
    public static bool DbOnline() 
    { 
     const int MaxRetries = 10; 
     int count = 0; 

     while (count < MaxRetries) 
     { 
      try 
      { 
       // Just access the database. any cheap query is ok since we don't care about the result. 
       return true; 
      } 
      catch (Exception ex) 
      { 
       Thread.Sleep(30000); 
       count++; 
      } 
     } 
     return false; 
    } 
} 
0

: 私は、次のような関数を使用します。 ProjectInstallerのプロパティの1つがServicesDependedOnになります。その文字列の配列にサービスを追加すると(IDE経由で行うこともできます)、サービスを開始する前にサービスを開始する必要があります。それらが起動されていない場合、SCMはそれらを試して起動します。

1

ここで述べたように、ServiceInstaller Classを使用する必要がありますが、フルブローン設定プロジェクトは必要ありません。 .NET Frameworkに付属のコマンドラインユーティリティInstallUtil.exeを使用して簡単にインストールできます。

関連する問題