Links
Create the project
- File → New → Project
- Windows Service (.NET Framework)
- Rename Service1.cs to MyService.cs
- Double-click on MyService.cs to open the designer → Properties → ServiceName = MyService
Code
MyService.cs
|
public partial class MyService : ServiceBase
{
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{ }
protected override void OnStop()
{ }
}
|
Program.cs
|
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
}
|
- Right-click on MyService.cs → View Designer
- Right-click on the background → Add Installer
- A new class ProjectInstaller has been added
- Right-click on ProjectInstaller.cs → View Designer
- Description = This service manages the ...
- DisplayName = My service
- StartType = Automatic
- Select serviceProcessInstaller1 → Properties → Account = LocalSystem
- Right-click on MyService project → Properties
- Application tab → Startup object = MyService.Program
|
# first deploy your service (MyService.exe) to the folder "C:\Program Files\MyService"
# install MyService
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "C:\Program Files\MyService\MyService.exe"
# uninstall MyService
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u "C:\Program Files\MyService\MyService.exe"
|
MyServiceInstaller.cs
|
[RunInstaller(true)]
public class MyServiceInstaller : Installer
{
public MyServiceInstaller()
{
var processInstaller = new ServiceProcessInstaller();
var serviceInstaller = new ServiceInstaller();
var assemblyDescription = Assembly.GetExecutingAssembly()
.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)
.OfType<AssemblyDescriptionAttribute>().FirstOrDefault();
processInstaller.Account = ServiceAccount.LocalSystem;
serviceInstaller.ServiceName = typeof(MyService).Name;
serviceInstaller.DisplayName = string.Concat(typeof(MyService).Name.Select(x => Char.IsUpper(x) ? $" {x}" : $"{x}")).TrimStart(' ');
serviceInstaller.Description = assemblyDescription?.Description;
serviceInstaller.StartType = ServiceStartMode.Manual;
this.Installers.Add(processInstaller);
this.Installers.Add(serviceInstaller);
}
}
|
AssemblyInfo.cs
|
[assembly: AssemblyDescription("My Assembly description.")]
|
Open a powershell prompt with administrative credentials.
|
cd $home\source\repos\MyService\MyService\bin\Debug
New-Service -Name "MyService" -DisplayName "My service" -Description "This service runs ..." -StartupType "Manual" -BinaryPathName MyService.exe
# uninstall, PowerShell 6 or later is required
Remove-Service -Name "MyService"
# after the executable for a service is deleted, the service might still be present in the registry
# remove the entry for the service from the registry
sc.exe delete "MyService"
|
Open Developer Command Prompt for VS with administrative credentials.
|
cd %UserProfile%\source\repos\MyService\MyService\bin\Debug
installutil MyService.exe
REM %windir%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe
REM uninstall the service
installutil.exe /u MyService.exe
|
- Install the Wix Toolset Visual Studio Extension