How do I install a Windows Service programmatically without using installutil.exe?
-
And not using any other 3rd party installers?Paul Sasik– Paul Sasik2010-01-15 14:40:13 +00:00Commented Jan 15, 2010 at 14:40
-
yep....i wish i could use a function like installservice() and when i double click the windowsservice.exe,it checks whether its installed,if not installed,it installs itself.Josh– Josh2010-01-15 14:42:55 +00:00Commented Jan 15, 2010 at 14:42
-
2that is one good function :):)Danail– Danail2010-01-15 14:46:00 +00:00Commented Jan 15, 2010 at 14:46
5 Answers
You can install the service by adding this code (in the program file, Program.cs) to install itself when run from the commandline using specified parameters:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
if (System.Environment.UserInteractive)
{
if (args.Length > 0)
{
switch (args[0])
{
case "-install":
{
ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
break;
}
case "-uninstall":
{
ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
break;
}
}
}
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyService() };
ServiceBase.Run(ServicesToRun);
}
}
5 Comments
ManagedInstallerClass.InstallHelper(srvExe) from another console app, would this app wait till InstallHelper exits (with installation finnished)? Thanks.I use the method from the following CodeProject article, and it works great.
2 Comments
ManagedInstallerClass.InstallHelper(srvExe) from another console app, would this app wait till InstallHelper exits (with installation finnished)? Thanks.I install and uninstall my Windows Service via the command line, e.g., MyWindowsService.exe -install and MyWindowsService.exe -uninstall, to avoid using installutil.exe myself. I've written a set of instructions for how to do this here.
2 Comments
I cannot comment bc of missing reputation, but regarding Mark Redman's Solution - If you wonder you cannot find your key in the given path, checkout the WOW6432Node
From AdvancedInstaller:
"The Wow6432Node registry entry indicates that you are running a 64-bit Windows version.
The operating system uses this key to display a separate view of HKEY_LOCAL_MACHINE\SOFTWARE for 32-bit applications that run on 64-bit Windows versions. When a 32-bit application writes or reads a value under the HKEY_LOCAL_MACHINE\SOFTWARE\<company>\<product> subkey, the application reads from the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\<company>\<product> subkey.
A registry reflector copies certain values between the 32-bit and 64-bit registry views (mainly for COM registration) and resolves any conflicts using a "last-writer-wins" approach."
Comments
None of the above work with .Net Core, however see my answer here on a possible solution: https://stackoverflow.com/a/76732404/440503 using System.Diagnostics.Process to start sc.exe.
Use sc.exe from a command line with no arguments to find its usage.