Quindi abbiamo prodotto un servizio Windows per fornire dati alla nostra applicazione client e tutto sta andando alla grande. Il client ha escogitato una divertente richiesta di configurazione che richiede due istanze di questo servizio in esecuzione sullo stesso server e configurate per puntare a database separati.
Finora non sono stato in grado di farlo accadere e speravo che i miei colleghi membri di stackoverflow potessero essere in grado di fornire alcuni suggerimenti sul perché.
Configurazione corrente:
Ho impostato il progetto che contiene il servizio Windows, lo chiameremo AppService d'ora in poi, e il file ProjectInstaller.cs che gestisce i passaggi di installazione personalizzati per impostare il nome del servizio in base a una chiave in App.config in questo modo :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
In questo caso Util è solo una classe statica che carica il nome del servizio dal file di configurazione.
Da qui in avanti ho provato due modi diversi per installare entrambi i servizi ed entrambi hanno fallito in modo identico.
Il primo modo era semplicemente installare la prima copia del servizio, copiare la directory installata e rinominarla, quindi eseguire il seguente comando dopo aver modificato la configurazione dell'app per cambiare il nome del servizio desiderato:
InstallUtil.exe /i AppService.exe
Quando non ha funzionato, ho provato a creare un secondo progetto di installazione, ho modificato il file di configurazione e ho creato il secondo programma di installazione. Quando ho eseguito il programma di installazione ha funzionato bene, ma il servizio non è stato visualizzato in services.msc, quindi ho eseguito il comando precedente sulla seconda base di codice installata.
Entrambe le volte ho ricevuto il seguente output da InstallUtil (solo parti rilevanti):
Esecuzione di un'installazione con transazione.
Inizio della fase di installazione dell'installazione.
Installazione del servizio App Service Two ... Il servizio App Service Two è stato installato correttamente. Creazione del servizio app di origine EventLog due nell'applicazione di registro in corso ...
Si è verificata un'eccezione durante la fase di installazione. System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.
La fase di rollback dell'installazione sta iniziando.
Ripristino del registro eventi allo stato precedente per il servizio app di origine due. Il servizio app servizio due è stato rimosso dal sistema ... il servizio app servizio due è stato rimosso correttamente dal sistema.
La fase di rollback è stata completata correttamente.
L'installazione transata è stata completata. L'installazione non è riuscita e il rollback è stato eseguito.
Ci scusiamo per il post prolisso, volevo assicurarmi che ci fossero abbastanza informazioni pertinenti. Il pezzo che finora mi ha lasciato perplesso è che afferma che l'installazione del servizio viene completata con successo e solo dopo che va a creare la sorgente EventLog che sembra essere generata l'eccezione NullReferenceException. Quindi, se qualcuno sa cosa sto sbagliando o ha un approccio migliore, sarebbe molto apprezzato.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Puoi inserire il codice nel programma di installazione per ottenere il nome del servizio che desideri quando esegui installutil.