Installeer Windows Service gemaakt in Visual Studio

Wanneer ik een nieuwe Windows-service maak in Visual Studio 2010, krijg ik het bericht dat ik InstallUtil en net start moet gebruiken om de service uit te voeren.

Ik heb de volgende stappen geprobeerd:

  1. Create new project File -> New -> Project -> Windows Service
  2. Project Name: TestService
  3. Build project as is (Service1 constructor, OnStart, OnStop)
  4. Open command prompt, run "C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exe
  5. Run net start TestService.

Uitvoer van stap 4

Een verhandelde installatie uitvoeren

     

Beginnen met de installatiefase van de installatie.

     

Zie de inhoud van het logbestand voor de   C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe   vooruitgang van de assemblage.

     

Het bestand bevindt zich in C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projects \ Tes   tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

     

Assemblage installeren 'C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projecten \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe '.

     

De betreffende parameters zijn:

     

logtoconsole =

     

logfile = C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projects \ TestService \ T   estService \ obj \ x86 \ Debug \ TestService.InstallLog

     

assemblypath = C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

     

Geen openbare installatieprogramma's met het kenmerk RunInstallerAttribute.Jes   was te vinden in de C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projecten \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe   assemblage.

     

De installatiefase is met succes voltooid en de fase Commit is   beginnen.

     

Zie de inhoud van het logbestand voor de   C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe   vooruitgang van de assemblage.

     

Het bestand bevindt zich in C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projects \ Tes   tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

     

Assembleren 'C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projecten \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe '.

     

De betreffende parameters zijn:

     

logtoconsole =

     

logfile = C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projects \ TestService \ T   estService \ obj \ x86 \ Debug \ TestService.InstallLog

     

assemblypath = C: \ Gebruikers \ mijngebruikersnaam \ Documenten \ Visual Studio   2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

     

Geen openbare installatieprogramma's met het kenmerk RunInstallerAttribute.Jes   was te vinden in de C: \ Users \ mijngebruikersnaam \ Documents \ Visual Studio   2010 \ Projecten \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe   assemblage.

     

InstallState-bestand verwijderen omdat er geen installatieprogramma's zijn

     

De Commit-fase is met succes voltooid.

     

De verhandelde installatie is voltooid.

Uitvoer van stap 5

De servicenaam is ongeldig.

Meer hulp is beschikbaar door NET HELPMSG 2185 te typen.

117

6 antwoord

U moet het Service.cs-bestand in de ontwerper openen, er met de rechtermuisknop op klikken en de menuoptie "Installatie toevoegen" kiezen.

Het zal niet direct uit de doos worden geïnstalleerd ... u moet eerst de installer-klasse maken.

Enige referentie over service-installatieprogramma:

Hoe: voeg installateurs toe aan uw servicetoepassing

Heel oud ... maar dit is waar ik het over heb:

Windows Services in C #: Het installatieprogramma toevoegen (deel 3)

Hierdoor wordt automatisch een ProjectInstaller.cs aangemaakt. Vervolgens kunt u dubbelklikken, de ontwerper invoeren en de componenten configureren:

  • serviceInstaller1 heeft de eigenschappen van de service zelf: Beschrijving , DisplayName , ServiceName en < code> StartType zijn het belangrijkst.

  • serviceProcessInstaller1 heeft deze belangrijke eigenschap: Account , het account waarin de service wordt uitgevoerd.

Bijvoorbeeld:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
215
toegevoegd
Ik krijg dezelfde fout in VS2013. Ik heb de links die je hebt opgegeven gecontroleerd, geverifieerd dat ik ProjectInstaller heb, inclusief de componentservice [Process] Installer1, correct geconfigureerd. Ik voer installutil.exe uit als beheerder. Het rapporteert nog steeds: "Geen openbare installatieprogramma's met het kenmerk RunInstallerAttribute.Jes kunnen worden gevonden". Om het even welke ideeën?
toegevoegd de auteur Barry Dysert, de bron
Lol. Ik vind het geweldig dat de link "Heel oud" naar een site met de naam Arcane Code gaat. Hoe ouder die pagina wordt, hoe beter de naam wordt :-)
toegevoegd de auteur HotN, de bron
Het toevoegen van het installatieprogramma en het instellen van het account op LocalSystem heeft het gedaan. Bedankt!
toegevoegd de auteur Luc, de bron

Kijken naar:

Geen openbare installatieprogramma's met het kenmerk RunInstallerAttribute.Jes kunnen worden gevonden in de assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Het ziet ernaar uit dat u geen installer-klasse in uw code hebt. Dit is een klasse die erft van Installer die installutil vertelt hoe u uw uitvoerbare bestand als een service installeert.

P.s. I have my own little self-installing/debuggable Windows Service template here which you can copy code from or use: Debuggable, Self-Installing Windows Service

11
toegevoegd
Wanneer ik met de rechtermuisknop op het TestService-project in Visual Studio -> Eigenschappen -> Services klik, wordt de pagina uitgeschakeld ... verwijs je naar een andere locatie? Onder toepassing is de assembly-naam TestService.
toegevoegd de auteur jkh, de bron
@John: Negeer het eerste deel over de serviceconsole, bekijk het tweede deel dat begint met eigenlijk . Het lijkt erop dat de service nooit is geïnstalleerd omdat er geen installatieprogramma is gevonden.
toegevoegd de auteur James Michael Hare, de bron

Hier is een alternatieve manier om het installatieprogramma te maken en van die foutmelding af te komen. Ook lijkt het erop dat de VS2015-express niet beschikt over het menu-item "Voeg installateur toe".

U hoeft alleen maar een klasse te maken en de onderstaande code toe te voegen en de referentie System.Configuration.Install.dll toe te voegen.

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
toegevoegd
Ook het uitvoeren van VS2015 en deze oplossing bracht me voorbij het foutbericht "Geen openbare installatieprogramma's met het foutbestand RunInstallerAttribute.Ja" dat ik eerder had. Dank je!
toegevoegd de auteur PHBeagle, de bron

Een ander mogelijk probleem (dat ik tegenkwam):

Zorg ervoor dat de klasse ProjectInstaller public is. Om eerlijk te zijn, ik weet niet precies hoe ik het heb gedaan, maar ik heb event handlers naaregevoegd aan ProjectInstaller.Designer.cs , zoals:

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

Ik denk dat tijdens het aunaarmatische proces van het maken van de handler-functie in ProjectInstaller.cs het de klassedefinitie veranderde van

openbare klasse ProjectInstaller: System.Configuration.Install.Installer

naar

partiële klasse ProjectInstaller: System.Configuration.Install.Installer

replacing the public keyword with partial. So, in order naar fix it it must be

openbare deelklasse ProjectInstaller: System.Configuration.Install.Installer

Ik gebruik Visual Studio 2013 Community-editie.

3
toegevoegd

Twee typische problemen:

  1. Ontbreekt de klasse ProjectInstaller (zoals @MiguelAngelo heeft aangegeven)
  2. De opdrachtprompt moet "Uitvoeren als Beheerder "
3
toegevoegd

Stealth-wijziging in VS 2010 en .NET 4.0 en hoger

No public installers with the RunInstallerAttribute.Yes attribute could be found

Er is een alias-wijziging of compilatieopruiming in .NET die dit kleine probleem voor uw specifieke geval kan onthullen.

Als je de volgende code hebt ...

RunInstaller(true)  //old alias  

U moet dit mogelijk bijwerken

RunInstallerAttribute(true) //new property spelling

Het is als een alias die onder de covers is gewijzigd tijdens het compileren of tijdens runtime en u krijgt dit foutgedrag. De bovenstaande expliciete wijziging in RunInstallerAttribute (true) corrigeerde het in al onze installatiescenario's op alle computers.

Nadat u een project- of service-installatieprogramma hebt toegevoegd, controleert u de "oude" RunInstaller (true) en wijzigt u deze in het nieuwe RunInstallerAttribute (true)

1
toegevoegd
Naar mijn weten kun je de postfix "Attribuut" weglaten, d.w.z. [RunInstaller (true)] en [RunInstallerAttribute (true)] is hetzelfde. Probeer het met een ander attribuut, bijvoorbeeld [DebuggerStepThrough ()] en [DebuggerStepThroughAttribute ()] - beide werken wanneer ze worden toegepast op een klasse.
toegevoegd de auteur Matt, de bron