Instalarea serviciului Windows creat în Visual Studio (Programare, C#, Windows, Service, Servicii Windows, Installutil)

jkh a intrebat.

Când creez un nou serviciu Windows în Visual Studio 2010, primesc mesajul care indică utilizarea InstallUtil și net start pentru a rula serviciul.

Am încercat următorii pași:

  1. Create new project File -> New -> Project -> Windows Service
  2. Numele proiectului: Project Name: TestService
  3. Construiți proiectul așa cum este (Service1 constructor, OnStart, OnStop)
  4. Deschideți promptul de comandă, rulați „C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe” TestService.exe
  5. Rulați net start TestService.

Rezultatul pasului 4

Se execută o instalare tranzacționată.

Începe faza de instalare a instalării.

Consultați conținutul fișierului jurnal pentru evoluția ansamblului C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestServiceobjx86DebugTestService.exe.

Fișierul este localizat la C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTes tServiceTestServiceobjx86DebugTestService.InstallLog.

Instalarea ansamblului ‘C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestServiceTestServiceobjx86DebugTestService.exe’.

Parametrii afectați sunt:

logtoconsole =

logfile = C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceT estServiceobjx86DebugTestService.InstallLog

assemblypath = C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServ iceTestServiceobjx86DebugTestService.exe

În ansamblul C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestSe rviceobjx86DebugTestService.exe nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes.

Faza de instalare s-a finalizat cu succes, iar faza de confirmare începe.

Consultați conținutul fișierului jurnal pentru evoluția ansamblului C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestServiceobjx86DebugTestService.exe.

Fișierul este localizat la C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTes tServiceTestServiceobjx86DebugTestService.InstallLog.

Angajarea ansamblului ‘C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestServiceobjx86DebugTestService.exe’.

Parametrii afectați sunt:

logtoconsole =

logfile = C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceT estServiceobjx86DebugTestService.InstallLog

assemblypath = C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServ iceTestServiceobjx86DebugTestService.exe

În ansamblul C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestSe rviceobjx86DebugTestService.exe nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes.

Eliminați fișierul InstallState deoarece nu există instalatori.

Faza Commit s-a finalizat cu succes.

Instalarea tranzacționată s-a finalizat.

Rezultatul etapei 5

Numele serviciului nu este valid.

Mai mult ajutor este disponibil tastând NET HELPMSG 2185.

7 răspunsuri
Miguel Angelo

Trebuie să deschizi fișierul Service.cs în designer, să dai click dreapta pe el și să alegi opțiunea de meniu „Add Installer”.

Nu se va instala imediat… trebuie să creezi mai întâi clasa de instalare.

Câteva referințe despre instalatorul de servicii:

How to: Adăugați instalatori la aplicația de servicii

Destul de vechi… dar despre asta vorbesc:

Servicii Windows în C#: Adăugarea instalatorului (partea 3)

Făcând acest lucru, o ProjectInstaller.cs va fi creat în mod automat. Apoi, puteți face dublu clic pe acesta, intrați în designer și configurați componentele:

  • serviceInstaller1 are proprietățile serviciului în sine: Description, , DisplayName, , ServiceName și StartType sunt cele mai importante.

  • serviceProcessInstaller1 are această proprietate importantă: Account acesta este contul în care se va executa serviciul.

De exemplu:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

Comentarii

  • Adăugarea programului de instalare și setarea contului la LocalSystem a reușit. Vă mulțumim! –  > Por Luc.
  • Primesc aceeași eroare în VS2013. Am verificat linkurile pe care mi le-ați furnizat, am verificat că am ProjectInstaller, inclusiv componentele service[Process]Installer1, configurate corect. Execut installutil.exe ca administrator. Acesta raportează în continuare „Nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes”. Aveți vreo idee? –  > Por Barry Dysert.
  • Lol. Îmi place că linkul „Destul de vechi” este către un site numit Arcane Code. Cu cât devine mai veche acea pagină, cu atât numele devine mai adevărat 🙂 –  > Por HotN.
  • Ce este „designerul”? Aplicațiile care nu au UI în general nu implică nimic care să fie numit designer. –  > Por Maxx.
  • Serviciile au, de asemenea, un designer, la fel ca și formularele –  > Por Grungondola.
James Michael Hare

Se uită la:

Nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes în ansamblul C:UsersmyusernameDocumentsVisual Studio 2010ProjectsTestServiceTestSe rviceobjx86DebugTestService.exe.

Se pare că este posibil să nu aveți o clasă de instalare în cod. Aceasta este o clasă care moștenește din Installer care va spune installutil cum să vă instalați executabilul ca serviciu.

P.s. Am propriul meu mic șablon de serviciu Windows autoinstalabil/depanabil aici, din care puteți copia codul sau pe care îl puteți folosi: Serviciu Windows cu auto-instalare și depanare

Comentarii

  • Când dau click dreapta pe proiectul TestService în Visual Studio -> Properties -> Services, pagina este dezactivată…te-ai referit la o altă locație? În Aplicație, numele ansamblului este TestService. –  > Por jkh.
  • @John: Ignorați prima parte despre consola de servicii, uitați-vă la a doua parte care începe cu De fapt,. Se pare că serviciul nu s-a instalat niciodată pentru că nu a găsit un program de instalare. –  > Por James Michael Hare.
Carol

Iată o modalitate alternativă de a crea programul de instalare și de a scăpa de acest mesaj de eroare. De asemenea, se pare că VS2015 express nu are elementul de meniu „Add Installer”.

Trebuie doar să creați o clasă și să adăugați codul de mai jos și să adăugați referința System.Configuration.Install.dll.

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

Comentarii

  • Rulez și VS2015 și această soluție m-a făcut să trec de mesajul de eroare „No public installers with the RunInstallerAttribute.Yes ” pe care îl primeam anterior. Vă mulțumesc! –  > Por PHBeagle.
fabriciorissetto

Două probleme tipice:

  1. Lipsește clasa ProjectInstaller (așa cum a arătat @MiguelAngelo)
  2. prompt de comandă trebuie să „Run as Administrator

John Archer

O altă posibilă problemă (pe care am întâlnit-o și eu):

Asigurați-vă că ProjectInstaller clasa este public. Ca să fiu sincer, nu sunt sigur cum anume am făcut-o, dar am adăugat gestionari de evenimente la ProjectInstaller.Designer.cs, , cum ar fi:

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

Cred că în timpul procesului automat de creare a funcției de gestionare în ProjectInstaller.cs a schimbat definiția clasei din

public class ProjectInstaller : System.Configuration.Install.Installer

în

partial class ProjectInstaller : System.Configuration.Install.Installer

înlocuind public cu partial. Deci, pentru a o repara trebuie să fie

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

Folosesc Visual Studio 2013 Community edition.

Comentarii

  • Știu că este cu 3 ani mai târziu, dar asta mi-a rezolvat problema. Nu sunt sigur de ce sau când designerul a schimbat clasa parțială publică anterioară în clasă parțială internă. Vă mulțumesc! –  > Por trashrobber.
Sql Surfer

Schimbare invizibilă în VS 2010 și .NET 4.0 și ulterior

Nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes

Există o schimbare de alias sau o curățare a compilatorului în .NET care poate dezvălui această mică modificare pentru cazul dvs. specific.

Dacă aveți următorul cod …

RunInstaller(true)   // old alias  

Este posibil să fie necesar să îl actualizați la

RunInstallerAttribute(true)  // new property spelling

Este ca și cum un alias s-a schimbat sub acoperire în timpul compilării sau în timpul execuției și veți obține acest comportament de eroare. Modificarea explicită de mai sus la RunInstallerAttribute(true) a rezolvat problema în toate scenariile noastre de instalare pe toate mașinile.

După ce adăugați programul de instalare a proiectului sau a serviciului, verificați dacă există „vechiul” RunInstaller(true) și schimbați-l cu noul RunInstallerAttribute(true).

Comentarii

  • După cunoștințele mele, puteți omite postfixul „Attribute”, adică [RunInstaller(true)] și [RunInstallerAttribute(true)] este același lucru. Încercați cu un atribut diferit, de exemplu [DebuggerStepThrough()] și [DebuggerStepThroughAttribute()] – ambele vor funcționa atunci când sunt aplicate unei clase. –  > Por Matt.
utilizator7667810

Încă o altă capcană de care m-am lovit: asigurați-vă că clasa dvs. derivată din Installer (de obicei ProjectInstaller) se află în partea de sus a ierarhiei spațiului de nume, am încercat să folosesc o clasă publică în cadrul unei alte clase publice, dar acest lucru duce la aceeași eroare veche:

Nu a putut fi găsit niciun instalator public cu atributul RunInstallerAttribute.Yes.