如何將VS下Windows服務項目生成的exe注冊為windows服務,讓其直接從后台運行
方法一:使用windows自帶的命令sc,首先我們要用管理員運行cmd
注冊服務:
sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows測試服務"
注意:所有的等號和值之間需要一個空格(等號前不要空格,等號后要一個空格) !!
——binpath和等號之間不要空格,等號和安裝路徑(例如"= D:\Test\Test.WindowsService.exe")之間要空格
binpath:你的應用程序所在的路徑。
displayname:服務顯示的名稱。
description:服務描述說明。
如何判斷服務是否注冊成功:
在cmd中輸入services.msc打開系統服務,查看是否出現“Windows測試服務”(即displayname=后面的參數,我這里設置的是“Windows測試服務”)
修改描述:
sc description TestService "這是一個Windows測試服務。"
啟動服務:
net start TestService
停止服務:
net stop TestService
刪除服務:
sc delete TestService
SC命令的更多用法請在查看help sc
使用時我們一般用個文本文檔寫入命令然后保存成bat格式的文件,添加服務一個,刪除服務一個。
例如 “添加服務.bat” 或 Install.bat 內容如下:
@echo off echo 正在安裝服務請稍等... set curdir=%~dp0 cd /d %curdir% sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows測試服務" sc description TestService "Windows測試服務,不要刪除" echo ----------------------------- echo 服務安裝成功 echo ----------------------------- echo 正在啟動服務請稍等... net start TestService echo ----------------------------- echo 服務啟動成功 echo ----------------------------- pause
“刪除服務.bat” 或 unInstall.bat 內容如下:
@echo off echo 正在停止服務請稍等... net stop TestService echo ----------------------------- echo 服務停止成功 echo ----------------------------- echo 正在卸載服務請稍等... set curdir=%~dp0 cd /d %curdir% sc delete TestService echo ----------------------------- echo 服務卸載成功 echo ----------------------------- pause
方法二:在Windows服務項目中引入(Topshelf是一個開源的跨平台的宿主服務框架),並且在Program.cs 和 App.config 中做如下配置:
Program.cs
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using Topshelf; using Test.WindowsService.BusService; namespace Test.WindowsService { /// <summary> /// Topshelf是一個開源的跨平台的宿主服務框架,支持Windows和Mono /// </summary> public static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> public static void Main() { //ServiceBase[] ServicesToRun; //ServicesToRun = new ServiceBase[] //{ // new Service1() //}; //ServiceBase.Run(ServicesToRun); try { var serviceName = System.Configuration.ConfigurationManager.AppSettings["ServiceName"]; var displayName = System.Configuration.ConfigurationManager.AppSettings["DisplayName"]; var description = System.Configuration.ConfigurationManager.AppSettings["Description"]; //方式一加載配置文件(配置文件和exe執行文件放在同一目錄,配置文件屬性設置成始終復制) //string assemblyFilePath = Assembly.GetExecutingAssembly().Location; //string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath); //string configFilePath = assemblyDirPath + "\\log4net.config"; //log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath)); //log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); //配置和運行宿主服務 HostFactory.Run(x => { //方式二加載配置文件(配置文件和exe執行文件放在同一目錄,配置文件屬性設置成始終復制) x.UseLog4Net("log4net.config"); //x.UseLog4Net(); //注冊服務 //x.Service(settings => new TopshelfService()); //x.Service<TopshelfService>(); x.Service<MqttService>(); //x.Service<TimerService>(s => //{ // s.ConstructUsing(name => new TimerService()); // s.WhenStarted(tc => tc.Start()); // s.WhenStopped(tc => tc.Stop()); // s.WhenPaused(tc => tc.Stop()); // s.WhenContinued(tc => tc.Start()); //}); //x.Service<DemoService>(s => //{ // //指定服務類型 // s.ConstructUsing(name => new DemoService()); // //當服務啟動后執行什么 // s.WhenStarted(tc => tc.Start()); // //當服務停止后執行什么 // s.WhenStopped(tc => tc.Stop()); //}); //服務用本地系統賬號來運行 x.RunAsLocalSystem(); //服務描述信息 x.SetDescription(description); //服務顯示名稱 x.SetDisplayName(displayName); //服務名稱 x.SetServiceName(serviceName); ////服務描述信息 //x.SetDescription("Windows測試服務,不要刪除"); ////服務顯示名稱 //x.SetDisplayName("Windows測試服務"); ////服務名稱 //x.SetServiceName("TestService"); x.EnablePauseAndContinue(); }); } catch (Exception ex) { Console.WriteLine(ex); } } } }
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServiceName" value="TestService" /> <add key="DisplayName" value="Windows測試服務" /> <add key="Description" value="Windows測試服務,不要刪除" /> <!--配置的應用唯一標識app 例: b2b_orderWeb--> <add key="configApp" value="Test.WindowsService" /> <!--配置的版本 例: 1.0.0.0--> <add key="configVerion" value="1.0.0.0" /> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
log4net.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--Console部分log輸出格式的設定 --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message %newline"/> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="D:\vhost\logs\ExampleWindowsService\" /> <!--追加日志內容--> <appendToFile value="true"/> <!--可以為:Once|Size|Date|Composite--> <!--Composite為Size和Date的組合--> <rollingStyle value="Date"/> <!--當備份文件時,為文件名加的后綴,這里可以作為每一天的日志分別存儲不同的文件--> <datePattern value="yyyy-MM-dd.TXT" /> <!--日志最大個數,都是最新的--> <!--rollingStyle節點為Size時,只能有value個日志--> <!--rollingStyle節點為Composite時,每天有value個日志--> <maxSizeRollBackups value="200" /> <!--可用的單位:KB|MB|GB--> <maximumFileSize value="20MB" /> <!--置為true,當前最新日志文件名永遠為file節中的名字--> <staticLogFileName value="false" /> <!--防止多線程時不能寫Log,官方說線程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <!--日志輸出格式:時間 日志類型 日志內容--> <conversionPattern value="%date [%thread] %-5level %logger - %message %newline" /> </layout> </appender> <root> <level value="ALL"/> <appender-ref ref="ConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> </root> </log4net> </configuration>
例如 “添加服務.bat” 或 Install.bat 內容如下:
@echo off echo 正在安裝服務請稍等... set curdir=%~dp0 cd /d %curdir% ..\bin\Debug\Test.WindowsService.exe install echo ----------------------------- echo 服務安裝成功 echo ----------------------------- echo 正在啟動服務請稍等... net start TestService echo ----------------------------- echo 服務啟動成功 echo ----------------------------- pause
“刪除服務.bat” 或 unInstall.bat 內容如下:
@echo off echo 正在停止服務請稍等... net stop TestService echo ----------------------------- echo 服務停止成功 echo ----------------------------- echo 正在卸載服務請稍等... set curdir=%~dp0 cd /d %curdir% ..\bin\Debug\Test.WindowsService.exe uninstall echo ----------------------------- echo 服務卸載成功 echo ----------------------------- pause
快捷方式:以管理員身份運行bat文件安裝和卸載
下面是用手動方式服務安裝、啟動和卸載
使用管理員身份cmd命令進入相應的文件夾位置
安裝:Test.WindowsService.exe install
啟動:Test.WindowsService.exe start
停止:Test.WindowsService.exe stop
卸載:Test.WindowsService.exe uninstall
方法三:
無法從命令行或調試器啟動服務,必須首先安裝Windows服務(使用installutil.exe),然后用ServerExplorer、Windows服務器管理工具或NET START命令啟動它
1. 以管理員身份運行cmd
2. 安裝windows服務
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.exe的路徑,注意InstallUtil.exe的版本號需要和項目的版本號相同)
3. 安裝windows服務
InstallUtil.exe D:\Service\需要安裝的服務.exe(項目的路徑)
4. 啟動windows服務
net start TestServive(服務名稱)
