wake-up-neo.net

Installieren Sie den in Visual Studio erstellten Windows-Dienst

Wenn ich in Visual Studio 2010 einen neuen Windows-Dienst erstelle, wird die Meldung angezeigt, dass InstallUtil und net start zum Ausführen des Diensts verwendet werden sollen.

Ich habe die folgenden Schritte ausprobiert:

  1. Neues Projekt erstellen Datei -> Neu -> Projekt -> Windows-Dienst
  2. Projektname: TestService
  3. Projekt wie es ist erstellen (Service1-Konstruktor, OnStart, OnStop)
  4. Öffnen Sie die Eingabeaufforderung und führen Sie "C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exe aus
  5. Führen Sie net start TestService aus.

Ausgabe von Schritt 4

Ausführen einer abgeschlossenen Installation.

Beginn der Installationsphase der Installation.

Informationen zum Fortschritt der Assembly C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projects\TestService\TestService\obj\x86\Debug\TestService.exe finden Sie in der Protokolldatei.

Die Datei befindet sich unter C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.InstallLog.

Installieren der Assembly "C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.exe".

Betroffene Parameter sind:

logtoconsole =

logfile = C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.InstallLog

assemblypath = C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.exe

In der Assembly C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projects\TestService\Testservice\obj\x86\Debug\TestService.exe wurden keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden.

Die Installationsphase wurde erfolgreich abgeschlossen und die Festschreibungsphase beginnt.

Informationen zum Fortschritt der Assembly C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projects\TestService\TestService\obj\x86\Debug\TestService.exe finden Sie in der Protokolldatei.

Die Datei befindet sich unter C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.InstallLog.

Festschreiben der Assembly "C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.exe".

Betroffene Parameter sind:

logtoconsole =

logfile = C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.InstallLog

assemblypath = C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projekte\TestService\TestService\obj\x86\Debug\TestService.exe

In der Assembly C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projects\TestService\Testservice\obj\x86\Debug\TestService.exe wurden keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden.

Entfernen Sie die InstallState-Datei, da keine Installationsprogramme vorhanden sind.

Die Commit-Phase wurde erfolgreich abgeschlossen.

Die durchgeführte Installation ist abgeschlossen.

Ausgabe von Schritt 5

Der Servicename ist ungültig.

Weitere Hilfe erhalten Sie, indem Sie NET HELPMSG 2185 eingeben.

132
jkh

Sie müssen die Datei Service.cs im Designer öffnen, mit der rechten Maustaste darauf klicken und die Menüoption "Installer hinzufügen" auswählen.

Es wird nicht sofort installiert ... Sie müssen zuerst die Installationsklasse erstellen.

Einige Hinweise zum Service Installer:

Gewusst wie: Hinzufügen von Installationsprogrammen zu Ihrer Dienstanwendung

Ziemlich alt ... aber das ist es, worüber ich spreche:

Windows-Dienste in C #: Hinzufügen des Installationsprogramms (Teil 3)

Auf diese Weise wird ein ProjectInstaller.cs wird automatisch erstellt. Anschließend können Sie darauf doppelklicken, den Designer eingeben und die Komponenten konfigurieren:

  • serviceInstaller1 hat die Eigenschaften des Dienstes selbst: Description, DisplayName, ServiceName und StartType sind die wichtigsten.

  • serviceProcessInstaller1 hat diese wichtige Eigenschaft: Account Dies ist das Konto, in dem der Dienst ausgeführt wird.

Beispielsweise:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
232
Miguel Angelo

Anschauen:

In der Assembly C:\Benutzer\Benutzername\Dokumente\Visual Studio 2010\Projects\TestService\Testservice\obj\x86\Debug\TestService.exe wurden keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden.

Es sieht so aus, als hätten Sie möglicherweise keine Installer-Klasse in Ihrem Code. Dies ist eine Klasse, die von Installer erbt und installutil mitteilt, wie die ausführbare Datei als Dienst installiert werden soll.

Ps. Ich habe meine eigene kleine selbstinstallierende/debuggbare Windows Service-Vorlage, aus der Sie Code kopieren oder verwenden können: Debuggable, Self-Installing Windows Service

11

Hier ist eine alternative Möglichkeit, das Installationsprogramm zu starten und diese Fehlermeldung zu beseitigen. Außerdem scheint VS2015 Express nicht über den Menüpunkt "Installer hinzufügen" zu verfügen.

Sie müssen lediglich eine Klasse erstellen, den folgenden Code hinzufügen und den Verweis System.Configuration.Install.dll hinzufügen.

using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;


namespace SAS
{
    [RunInstaller(true)]
    public class MyProjectInstaller : Installer
    {
        private ServiceInstaller serviceInstaller1;
        private ServiceProcessInstaller processInstaller;

        public MyProjectInstaller()
        {
            // Instantiate installer for process and service.
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller1 = new ServiceInstaller();

            // The service runs under the system account.
            processInstaller.Account = ServiceAccount.LocalSystem;

            // The service is started manually.
            serviceInstaller1.StartType = ServiceStartMode.Manual;

            // ServiceName must equal those on ServiceBase derived classes.
            serviceInstaller1.ServiceName = "SAS Service";

            // Add installer to collection. Order is not important if more than one service.
            Installers.Add(serviceInstaller1);
            Installers.Add(processInstaller);
        }
    }
}
8
Carol

Zwei typische Probleme:

  1. Fehlende ProjectInstaller-Klasse (wie @MiguelAngelo gezeigt hat)
  2. Das Eingabeaufforderung muss "Ausführen als Administrator"
5

Ein weiteres mögliches Problem (auf das ich gestoßen bin):

Stellen Sie sicher, dass die Klasse ProjectInstallerpublic ist. Um ehrlich zu sein, ich bin mir nicht sicher, wie genau ich es gemacht habe, aber ich habe ProjectInstaller.Designer.cs Event-Handler hinzugefügt, wie:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Ich vermute, während des automatischen Erstellungsprozesses der Handler-Funktion in ProjectInstaller.cs Wurde die Klassendefinition von geändert

public class ProjectInstaller : System.Configuration.Install.Installer

zu

partial class ProjectInstaller : System.Configuration.Install.Installer

Ersetzen das Schlüsselwort public durch partial. Also, um es zu beheben, muss es sein

public partial class ProjectInstaller : System.Configuration.Install.Installer

Ich verwende die Visual Studio 2013 Community Edition.

3
John Archer

Stealth-Änderung in VS 2010 und .NET 4.0 und höher

Es wurden keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden

Es gibt eine Alias-Änderung oder Compiler-Bereinigung in .NET, die diesen kleinen Tweak für Ihren speziellen Fall enthüllen könnte.

Wenn Sie den folgenden Code haben ...

RunInstaller(true)   // old alias  

Möglicherweise müssen Sie es aktualisieren

RunInstallerAttribute(true)  // new property spelling

Es ist wie ein Alias, der beim Kompilieren oder zur Laufzeit im Hintergrund geändert wird, und Sie erhalten dieses Fehlerverhalten. Die obige explizite Änderung von RunInstallerAttribute (true) hat dies in allen unseren Installationsszenarien auf allen Computern behoben.

Nachdem Sie das Projekt- oder Dienstinstallationsprogramm hinzugefügt haben, suchen Sie nach dem „alten“ RunInstaller (true) und ändern Sie ihn in das neue RunInstallerAttribute (true).

2
Sql Surfer

Ein weiterer Haken, auf den ich gestoßen bin: Stellen Sie sicher, dass Ihre vom Installer abgeleitete Klasse (normalerweise ProjectInstaller) an der Spitze der Namespace-Hierarchie steht. Ich habe versucht, eine öffentliche Klasse in einer anderen öffentlichen Klasse zu verwenden, aber dies führt zu demselben alten Fehler :

Es wurden keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden.

1
Phlash