Installa il servizio Windows creato in Visual Studio


136

Quando creo un nuovo servizio Windows in Visual Studio 2010, ricevo il messaggio che indica di utilizzare InstallUtil e net start per eseguire il servizio.

Ho provato i seguenti passaggi:

  1. Crea nuovo file di progetto -> Nuovo -> Progetto -> Servizio Windows
  2. Nome del progetto: TestService
  3. Costruisci progetto così com'è (costruttore Service1, OnStart, OnStop)
  4. Aprire il prompt dei comandi, eseguire "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" TestService.exe
  5. Esegui Net Start TestService .

Uscita del passaggio 4

Esecuzione di un'installazione transata.

Inizio della fase di installazione dell'installazione.

Vedere il contenuto del file di registro per l'avanzamento dell'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Il file si trova in C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Installazione dell'assembly 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

I parametri interessati sono:

logtoconsole =

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

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Nessun programma di installazione pubblico con l'attributo RunInstallerAttribute.Yes è stato trovato nell'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

La fase di installazione è stata completata correttamente e inizia la fase di commit.

Vedere il contenuto del file di registro per l'avanzamento dell'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Il file si trova in C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Committing assembly 'C: \ Users \ nomeutente \ Documents \ Visual Studio 2010 \ Progetti \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe ".

I parametri interessati sono:

logtoconsole =

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

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Nessun programma di installazione pubblico con l'attributo RunInstallerAttribute.Yes è stato trovato nell'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Rimuovere il file InstallState perché non ci sono programmi di installazione.

La fase di commit è stata completata correttamente.

L'installazione eseguita è stata completata.

Uscita del passaggio 5

Il nome del servizio non è valido.

Ulteriori informazioni sono disponibili digitando NET HELPMSG 2185.

Risposte:


243

È necessario aprire il file Service.cs nella finestra di progettazione, fare clic con il tasto destro del mouse e selezionare l'opzione di menu "Aggiungi programma di installazione".

Non verrà installato immediatamente ... devi prima creare la classe di installazione.

Qualche riferimento sul programma di installazione del servizio:

Procedura: aggiungere installatori all'applicazione di servizio

Abbastanza vecchio ... ma questo è ciò di cui sto parlando:

Servizi Windows in C #: aggiunta del programma di installazione (parte 3)

In questo modo, ProjectInstaller.csverrà creata automaticamente una volontà. Quindi puoi fare doppio clic su questo, inserire il designer e configurare i componenti:

  • serviceInstaller1ha le proprietà del servizio stesso: Description, DisplayName, ServiceNamee StartTypesono i più importanti.

  • serviceProcessInstaller1ha questa proprietà importante: Accountquesto è l'account in cui verrà eseguito il servizio.

Per esempio:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
Aggiunta dell'installer e impostazione dell'account su LocalSystem. Grazie!
Luc

1
Ricevo lo stesso errore in VS2013. Ho controllato i collegamenti forniti, verificato che ho ProjectInstaller, incluso il servizio [Process] Installer1 dei componenti, correttamente configurato. Corro installutil.exe come amministratore. Riporta ancora "Impossibile trovare installer pubblici con l'attributo RunInstallerAttribute.Yes". Qualche idea?
Barry Dysert,

4
Lol. Adoro il link "Abbastanza vecchio" a un sito chiamato Arcane Code. Più vecchia è quella pagina, più vero diventa il nome :-)
HotN,

Che cos'è "il designer"? Le applicazioni che non hanno un'interfaccia utente in genere non implicano nulla che si possa definire un designer.
Maxx,

I servizi hanno anche un designer, proprio come le forme
Grungondola,

11

Guardando:

Nessun programma di installazione pubblico con l'attributo RunInstallerAttribute.Yes è stato trovato nell'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Sembra che potresti non avere una classe di installazione nel tuo codice. Questa è una classe che eredita da Installerche dirà installutilcome installare il tuo eseguibile come servizio.

Ps Ho qui il mio modello di servizio Windows autoinstallante / debuggable da cui è possibile copiare il codice o utilizzare: Servizio Windows debuggable, autoinstallante


Quando faccio clic con il pulsante destro del mouse sul progetto TestService in Visual Studio -> Proprietà -> Servizi, la pagina viene disabilitata ... ti riferivi a una posizione diversa? In Applicazione, il nome dell'Assemblea è TestService.
jkh,

@John: ignora la prima parte della console dei servizi, guarda la seconda parte che inizia con In realtà . Sembra che il servizio non sia mai stato installato perché non ha trovato un programma di installazione.
James Michael Hare,

8

Ecco un modo alternativo per rendere il programma di installazione e sbarazzarsi di quel messaggio di errore. Inoltre sembra che VS2015 express non abbia la voce di menu "Aggiungi programma di installazione".

Devi semplicemente creare una classe e aggiungere il codice seguente e aggiungere il riferimento 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);
        }
    }
}

Eseguendo anche VS2015 e questa soluzione mi ha superato il messaggio di errore "Nessun programma di installazione pubblico con RunInstallerAttribute.Yes" che stavo ottenendo in precedenza. Grazie!
PHBeagle

6

Due problemi tipici:

  1. Manca la classe ProjectInstaller (come ha indicato @MiguelAngelo)
  2. Il prompt dei comandi deve "Esegui come amministratore "

4

Un altro possibile problema (che ho riscontrato):

Assicurati che la ProjectInstallerclasse sia public. Ad essere sincero, non sono sicuro di come l'ho fatto esattamente, ma ho aggiunto i gestori di eventi a ProjectInstaller.Designer.cs, come:

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

Immagino che durante il processo automatico di creazione della funzione gestore in ProjectInstaller.csesso sia cambiata la definizione della classe

public class ProjectInstaller : System.Configuration.Install.Installer

per

partial class ProjectInstaller : System.Configuration.Install.Installer

sostituendo la publicparola chiave con partial. Quindi, per risolverlo, deve essere

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

Uso Visual Studio 2013 Community Edition.


So che sono trascorsi 3 anni, ma questo ha risolto il mio problema. Non so perché o quando il designer ha modificato la precedente classe parziale pubblica in classe parziale interna. Grazie!
trashrobber,

2

Cambiamenti invisibili in VS 2010 e .NET 4.0 e versioni successive

Impossibile trovare programmi di installazione pubblici con l'attributo RunInstallerAttribute.Yes

C'è una modifica alias o una pulizia del compilatore in .NET che potrebbe rivelare questo piccolo aggiustamento per il tuo caso specifico.

Se hai il seguente codice ...

RunInstaller(true)   // old alias  

Potrebbe essere necessario aggiornarlo a

RunInstallerAttribute(true)  // new property spelling

È come un alias modificato sotto le copertine in fase di compilazione o in fase di esecuzione e otterrai questo comportamento di errore. La precedente modifica esplicita a RunInstallerAttribute (true) l'ha risolto in tutti i nostri scenari di installazione su tutte le macchine.

Dopo aver aggiunto il programma di installazione del progetto o del servizio, controllare il "vecchio" RunInstaller (true) e modificarlo nel nuovo RunInstallerAttribute (true)


Per quanto ne so, è possibile omettere il postfix "Attributo", ovvero [RunInstaller (true)] e [RunInstallerAttribute (true)] è lo stesso. Provalo con un attributo diverso, ad esempio [DebuggerStepThrough ()] e [DebuggerStepThroughAttribute ()] - entrambi funzioneranno se applicati a una classe.
Matt,

1

Mi sono imbattuto in un'altra cattura: assicurati che la tua classe derivata dall'Installer (in genere ProjectInstaller ) sia in cima alla gerarchia dello spazio dei nomi, ho provato a usare una classe pubblica all'interno di un'altra classe pubblica, ma questo si traduce nello stesso vecchio errore:

Impossibile trovare programmi di installazione pubblici con l'attributo RunInstallerAttribute.Yes

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.