The approach is initially wrong.
There's a lot of opportunities to upgrade something, if a new version is available.
- Check them on install (some installer has autodownloader functions) - partial solution, no auto upgrade opportunity
- The service needs to discover new versions (background thread) - need some development [msi silent install in the background] <- prefered
- Centralized deploy - there are solutions for centralized install, even MS, IBM etc. has tools for this. So if a new solution is ready, then no matter what you can deploy them in your domain. <- not so cost effective, used tippicaly by large companies
+1 Also there are some ways you can do this without stopping a service. In C# you can load, and unload versioned assemblies on the fly, but makes your developer life real hard.
If you chose the 2.nd option, then you can start a "process asyncronly" from code so the installer will run with default options (search silent install) although you can define custom settings "my.msi -s config.file". The installer needs to be prepared for checking and stopping the service itself if already exists.
This is a complex story, search for some keywords I've mentioned.