2009-05-07 7 views
21

Ho creato un servizio Windows in C#, l'ho installato su un server e sta funzionando bene.Come si configura il nome di un servizio Windows al momento dell'installazione (o facilmente in fase di compilazione)?

Ora voglio installare di nuovo lo stesso servizio, ma in esecuzione da una directory di lavoro diversa, con un file di configurazione diverso ecc. Quindi, mi piacerebbe avere due istanze dello stesso servizio in esecuzione simultaneamente . Inizialmente, questo non è possibile poiché l'installatore si lamenterà che esiste già un servizio con il nome specificato installato.

Posso ovviare a questo cambiando il mio codice, impostando la proprietà ServiceBase.ServiceName su un nuovo valore, quindi ricompilando ed eseguendo nuovamente InstallUtil.exe. Tuttavia, io preferirei di gran lunga, se ho potuto impostare il nome del servizio al momento dell'installazione, cioè idealmente vorrei fare qualcosa di simile

InstallUtil.exe/i /servicename = "MyService grado 2" Servizio.exe

Se ciò non è possibile (ne dubito molto), mi piacerebbe poter inserire il nome del servizio quando creo il servizio. Ho pensato che potrebbe essere possibile utilizzare una sorta di evento di build, usare un abile msbuild o trucco nant o qualcosa del genere, ma non ne ho avuto la minima idea.

Qualsiasi suggerimento sarebbe molto apprezzato.

Grazie per il vostro tempo.

+1

C'è un motivo per cui non hai dato il tuo servizio la possibilità di eseguire la logica di business in n-thread per i file di n-config? Così salvando il problema di istanze multiple dall'inizio? – Nate

+0

Hmmm, potrebbe essere un buon punto. Ma il servizio è stato creato un anno fa, molto prima che mi rendessi conto che mi piacerebbe essere in grado di eseguire più istanze, quindi l'applicazione non è realmente progettata in modo appropriato. Tuttavia, ho trovato una soluzione e la pubblicherò in un secondo. – Rune

risposta

28

ho provato accedere a una configurazione utilizzando

ConfigurationManager.OpenExeConfiguration(string exePath) 

nel programma di installazione, ma non poteva farlo funzionare.

Invece ho deciso di utilizzare System.Environment.GetCommandLineArgs() nel programma di installazione in questo modo:

string[] commandlineArgs = Environment.GetCommandLineArgs(); 

string servicename; 
string servicedisplayname; 
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname); 

serviceInstaller.ServiceName = servicename; 
serviceInstaller.DisplayName = servicedisplayname; 

Ora posso installare i miei servizi utilizzando

InstallUtil.exe/i InstallableService.dll /servicename =" myserviceinstance_2 " /servicedisplayname =" Il mio servizio Istanza 2 "

Ho scritto una spiegazione più elaborata here.

+0

Guarda la domanda e la risposta per ottenere una soluzione perfetta per questo: http://stackoverflow.com/questions/ 8516701/how-to-get-windows-service-name-da-app-config – techExplorer

4

Non è possibile passare questo comando come argomento di riga di comando, dal momento che InstallUtil non fornisce gli hook giusti per questo.

Tuttavia, è possibile fare in modo che il programma di installazione del servizio legga ServiceName da un file di configurazione. Se si utilizza il ServiceInstaller per lo standard look at some code, si noterà che è necessario avere le proprietà DisplayName e ServiceName appropriate in fase di runtime. Questi potrebbero essere facilmente letti da un file di configurazione invece di essere codificati.

+0

Davvero? Ho provato a leggere questi valori dal file ServiceExeName.config durante l'installazione del servizio Windows e non ha funzionato :( – Darragh

2

Invece di utilizzare la classe Environment.GetCommandLineArgs();Installer ha una proprietà chiamata Context da cui è possibile accedere argomenti della riga di comando passati al InstallUtil strutturato in una bella StringDictionary.

Problemi correlati