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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With