2009-06-18 7 views

Antwort

1

Sie müssen die Abhängigkeiten angeben. Sie können dies in Ihrer Installer-Klasse tun.

Ein weitere Klärung

Sie sollten eine Installer Klasse als benutzerdefinierte Aktion in Ihrem Setup-Projekt verwenden, um Ihren Dienst zu installieren. Wenn nicht, poste einen Kommentar und ich aktualisiere diese Antwort mit Schritten, wie das geht.

Im Designer für Ihre Installer-Klasse sollten Sie zwei Komponenten sehen: einen serviceInstaller und einen serviceProcessInstaller. Ich kann mich nicht erinnern, welche von meinem Kopf oben, aber eine von diesen hat eine Eigenschaft, die es Ihnen ermöglicht, eine mehrzeilige Zeichenfolge anzugeben, die die Dienstnamen der Abhängigkeiten Ihres Diensts auflistet.

+0

Könnten Sie klarstellen, was Sie meinen? Wie würde mir das helfen? Danke –

+0

Wenn Sie den Service mit der Klasse ServiceInstaller (http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx) installieren, können Sie Abhängigkeiten mit der ServicesDependedOn-Eigenschaft hinzufügen. – adrianbanks

3

Ich glaube, Sie shoud diese Linie

installer.ServicesDependedOn = new String [] { "DependenceService"};

wie folgt aus:

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

Glück

+0

Abhängige Dienste werden automatisch gestartet, wenn Ihr Dienst gestartet wird, aber Ihr Dienst wird nicht automatisch gestartet, wenn sie bereits ausgeführt werden. Und das war die Frage, wie ich es verstanden habe. – devdimi

+0

ops ... Es tut mir leid, wenn ich das Problem missverstanden habe. – Jonathan

+0

Ich weiß dies eine saubere Lösung, aber als Workaround konnten wir den gewünschten Service-Status alle N Sekunden überprüfen: ServiceController Name = new ServiceController(); byServiceName.ServiceName = "ServiceWanted"; und dann: if (name.Status == ServiceControllerStatus.Running) { // Aktionen des Dienstes durchführen } – Jonathan

0

Haben Sie Kontrolle über die anderen Dienstleistungen? Wenn ja, haben sie dich gestartet, wenn nicht, ich denke, du musst sowieso anfangen und dich selbst überwachen, was los ist. Es ist möglich, sich bei WMI zu registrieren, um benachrichtigt zu werden, wenn andere Prozesse gestartet werden - es gibt eine Frage dazu.

+0

Es gibt eine Möglichkeit, die Dienstabhängigkeiten für Windows anzugeben. Daher wird nicht versucht, den Dienst zu starten, bis die anderen Dienste den Start beendet haben. – Bevan

+0

Das ist richtig, aber es hilft Ihnen nicht, wenn Sie möchten, dass Ihr Dienst nur gestartet wird, wenn andere Dienste bereits ausgeführt werden - und ich denke, das war die Frage. – devdimi

+0

@dev: Wie geht das nicht? Legen Sie die Abhängigkeiten und den Starttyp auf Automatisch fest. –

3

Zusätzlich zu den anderen Antworten, die bereits erwähnt wurden, müssen Sie, wenn einer dieser Dienste SQL Server ist, sicherstellen, dass die spezifische Datenbank sowie der SQL Server-Dienst selbst verfügbar sind. Ich verwende eine ähnliche Funktion wie die folgenden:

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

In Ihrem Service-Projekt, fügen Sie ein Projekt Installateur as described here. Eine der Eigenschaften Ihres ProjectInstaller ist ServicesDependedOn. Wenn Sie diesem Array von Zeichenfolgen Dienste hinzufügen (dies können Sie über die IDE tun), müssen sie gestartet werden, bevor der Dienst gestartet wird. Wenn sie nicht gestartet werden, versucht der SCM, sie zu starten.

1

Wie andere hier sagten, sollten Sie die ServiceInstaller Class verwenden, aber Sie brauchen kein komplettes geblasenes Setup-Projekt. Sie können eine schnelle Installation mithilfe des Befehlszeilenprogramms InstallUtil.exe ausführen, das mit dem .NET Framework geliefert wird.

Verwandte Themen