Installieren Sie den in Visual Studio erstellten Windows-Dienst


136

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

Ich habe die folgenden Schritte versucht:

  1. Neues Projekt erstellen Datei -> Neu -> Projekt -> Windows-Dienst
  2. Projektname: TestService
  3. Projekt so 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 getätigten Installation.

Beginn der Installationsphase der Installation.

Informationen zum Fortschritt der Assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe finden Sie im Inhalt der Protokolldatei.

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

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

Betroffene Parameter sind:

logtoconsole =

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

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

In der Assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ 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: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe finden Sie im Inhalt der Protokolldatei.

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

Festschreiben der Assembly 'C: \ Benutzer \ mein Benutzername \ Dokumente \ Visual Studio 2010 \ Projekte \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Betroffene Parameter sind:

logtoconsole =

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

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

In der Assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ 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 getätigte Installation ist abgeschlossen.

Ausgabe von Schritt 5

Der Dienstname ist ungültig.

Weitere Hilfe erhalten Sie durch Eingabe von NET HELPMSG 2185.

Antworten:


243

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 Installer-Klasse erstellen.

Einige Hinweise zum Service-Installationsprogramm:

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 ProjectInstaller.cswird automatisch ein Testament erstellt. Dann können Sie darauf doppelklicken, den Designer eingeben und die Komponenten konfigurieren:

  • serviceInstaller1hat die Eigenschaften des Dienstes selbst: Description, DisplayName, ServiceNameund StartTypesind die wichtigsten.

  • serviceProcessInstaller1hat diese wichtige Eigenschaft: AccountDas ist das Konto, in dem der Dienst ausgeführt wird.

Beispielsweise:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
Das Hinzufügen des Installationsprogramms und das Festlegen des Kontos auf LocalSystem haben dies getan. Vielen Dank!
Luc

1
Ich erhalte den gleichen Fehler in VS2013. Ich habe die von Ihnen angegebenen Links überprüft und sichergestellt, dass ProjectInstaller, einschließlich des Komponentendienstes [Process] Installer1, ordnungsgemäß konfiguriert ist. Ich führe installutil.exe als Administrator aus. Es wird weiterhin gemeldet, dass keine öffentlichen Installationsprogramme mit dem Attribut RunInstallerAttribute.Yes gefunden wurden. Irgendwelche Ideen?
Barry Dysert

4
Lol. Ich finde es toll, dass der Link "Ziemlich alt" zu einer Site namens Arcane Code führt. Je älter diese Seite wird,
desto

Was ist "der Designer"? Anwendungen ohne Benutzeroberfläche enthalten im Allgemeinen nichts, was als Designer bezeichnet wird.
Maxx

Dienstleistungen haben auch einen Designer, genau wie Formen
Grungondola

11

Anschauen:

In der Assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ 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 Installationsklasse in Ihrem Code. Dies ist eine Klasse, die davon erbt Installer, installutilwie Ihre ausführbare Datei als Dienst installiert wird.

Ps Ich habe hier meine eigene kleine selbstinstallierende / debuggbare Windows-Dienstvorlage, aus der Sie Code kopieren oder verwenden können: Debuggierbarer, selbstinstallierender Windows-Dienst


Wenn ich mit der rechten Maustaste auf das TestService-Projekt in Visual Studio -> Eigenschaften -> Dienste klicke, ist die Seite deaktiviert. Haben Sie sich auf einen anderen Speicherort bezogen? Unter Anwendung lautet der Assemblyname TestService.
JKH

@ John: Ignorieren Sie den ersten Teil der Servicekonsole und sehen Sie sich den zweiten Teil an, der mit Actually beginnt . Es sieht so aus, als ob der Dienst nie installiert wurde, weil er kein Installationsprogramm gefunden hat.
James Michael Hare

8

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

Sie müssen lediglich eine Klasse erstellen, den folgenden Code hinzufügen und die Referenz 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);
        }
    }
}

Durch das Ausführen von VS2015 und dieser Lösung habe ich die zuvor erhaltene Fehlermeldung "Keine öffentlichen Installationsprogramme mit RunInstallerAttribute.Yes" überwunden. Danke dir!
PHBeagle

6

Zwei typische Probleme:

  1. Fehlende ProjectInstaller-Klasse (wie @MiguelAngelo gezeigt hat)
  2. Die Eingabeaufforderung muss "Als Administrator ausführen ".

4

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

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

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

Ich denke, während des automatischen Prozesses des Erstellens der Handlerfunktion ProjectInstaller.csdarin wurde die Klassendefinition von geändert

public class ProjectInstaller : System.Configuration.Install.Installer

zu

partial class ProjectInstaller : System.Configuration.Install.Installer

Ersetzen des publicSchlüsselworts 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.


Ich weiß, dass dies 3 Jahre später ist, aber dies hat mein Problem gelöst. Nicht sicher, warum oder wann der Designer die vorherige öffentliche Teilklasse in eine interne Teilklasse geändert hat. Danke dir!
Trashrobber

2

Stealth Change in VS 2010 und .NET 4.0 und höher

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

In .NET gibt es eine Aliasänderung oder eine Compilerbereinigung, die diese kleine Optimierung für Ihren speziellen Fall aufzeigt.

Wenn Sie den folgenden Code haben ...

RunInstaller(true)   // old alias  

Möglicherweise müssen Sie es auf aktualisieren

RunInstallerAttribute(true)  // new property spelling

Es ist wie ein Alias, der zur Kompilierungszeit oder zur Laufzeit unter dem Deckmantel geändert wird, und Sie erhalten dieses Fehlerverhalten. Die obige explizite Änderung an RunInstallerAttribute (true) hat das Problem in allen unseren Installationsszenarien auf allen Computern behoben.

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


Nach meinem Wissen können Sie das Postfix "Attribut" weglassen, dh [RunInstaller (true)] und [RunInstallerAttribute (true)] sind identisch. Versuchen Sie es mit einem anderen Attribut, z. B. [DebuggerStepThrough ()] und [DebuggerStepThroughAttribute ()] - beide funktionieren, wenn sie auf eine Klasse angewendet werden.
Matt

1

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.