There are many complaints about the InstallUtil that is used to install Windows Services that are built using .NET. Albeit the utility is not great, the most common complaint is that it can't pass paramters to the installer class that developers are forced to include in there service. This very simple sample shows that you can indeed pass paramters from the InstallUtil command line and access them from your installer class.
Windows services written in the .NET languages are encouraged to use the Installer class to register the service with the SCM (Service Control Manager). Then once the service is complete, a command line utility called InstallUtil is used to 'register' the new service with Windows. The InstallUtil looks in your .NET assembly for a class derived from System.Configuration.Install.Installer and executes it to perform the 'registration' (confusingly called installation).
There are lots of questions on the 'net asking how to pass parameters from the command line of InstallUtil to this embedded Installer class so that the service can be registered with a specific account, service name, display name, ect. This sample will hopefully show how to do that.
Using the code
The service part of the sample does absolutely nothing as the code focuses on the embedded installer class. If you want a sample of how to code a Windows Service, there are thousands on this site and other site on the 'net.
The quick part of the solution is the Context property of the Installer class. This property is a Dictionary collection, with every parameter of the command line given to Installutil in it. They are already broken out into Key and Value pairs, and it is just a matter of iterating the collection and using the keys and values as you need them.
Points of Interest
The one thing I wished I could do is default the logtoconsole parameter to false. The default is true and with it on the output on the console is quite verbose and confusing.
First posted April 29th, 2008