Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I configure the name of a Windows service upon installation (or easily at compile time)?

Tags:

I've created a Windows service in C#, installed it on a server and it is running fine.

Now I want to install the same service again, but running from a different working directory, having a different config file etc. Thus, I would like to have two (or more) instances of the same service running simultaneously. Initially, this isn't possible since the installer will complain that there's already a service with the given name installed.

I can overcome this by changing my code, setting the ServiceBase.ServiceName property to a new value, then recompiling and running InstallUtil.exe again. However, I would much prefer if I could set the service name at install-time, i.e. ideally I would do something like

InstallUtil.exe /i /servicename="MyService Instance 2" MyService.exe

If this isn't achievable (I very much doubt it), I would like to be able to inject the service name when I build the service. I thought it might be possible to use some sort of build event, use a clever msbuild or nant trick or something along those lines, but I haven't got a clue.

Any suggestions would be greatly appreciated.

Thank you for your time.

like image 908
Rune Avatar asked May 07 '09 15:05

Rune


People also ask

How do I install the same windows service with a different name?

In case you need the same service running on the same host but with different configuration, logically you would use same code just copy the service folder with different configuration and use installutil to install service with a different name.

How do you call a windows service method into a web application?

If you want to call a windows service method on the server side of your web application then take a look at the WCF or RestSharp and Nancy. Shortly, you need to create a RESTfull service in the windows service application that will be using a http://localhost/myservice/transfer address to expose the Transfer method.


1 Answers

I tried accessing a configuration using

ConfigurationManager.OpenExeConfiguration(string exePath) 

in the installer, but couldn't get it to work.

Instead I decided to use System.Environment.GetCommandLineArgs() in the installer like this:

string[] commandlineArgs = Environment.GetCommandLineArgs();  string servicename; string servicedisplayname; ParseServiceNameSwitches(     commandlineArgs,      out servicename,      out servicedisplayname);  serviceInstaller.ServiceName = servicename; serviceInstaller.DisplayName = servicedisplayname; 

Now I can install my services using

InstallUtil.exe /i InstallableService.dll /servicename="myserviceinstance_2" /servicedisplayname="My Service Instance 2"

I wrote up a more elaborate explanation here.

like image 140
Rune Avatar answered Oct 09 '22 14:10

Rune