1. 基本流程
一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序。
同样,一个Windows服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。
和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess 和System.Diagnostics。
1.1 创建Windows Service项目
从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击 确定。
1.2 向服务中函数功能实现
OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。在这里,当启动和停止服务时,向一个文本文件中写入一些文字信息
1.3 回到设计窗口点右键选择-添加安装程序 -生成serviceInstaller1和 serviceProcessInstaller1两个组件
把serviceInstaller1的属性ServiceName改写为你的服务程序名,并把启动模 式设置为AUTOMATIC
把serviceProcessInstaller1的属性account改写为 LocalSystem
1.4 编译链接生成服务程序
通过从生成菜单中选择生成来生成项目。
1.5 安装服务
用.net framework工具INSTALLUTIL安装服务程序即可。
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码:
installutil yourproject.exe
Hint: a windows service must first be installed using installutil.exe and then started with the serviceExplorer, windows Services Administrative tool or the NET START command.
1.6 卸载服务
用项目的输出作为参数,从命令行运行 InstallUtil.exe。
installutil /u yourproject.exe
3. Windows服务安装异常
System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 访问的日志: Security
右键单击“以管理员身份运行”Visual Studio Command Prompt即可
4. Windows服务执行异常
错误:本地计算机上的XXX服务启动后又停止了
打开控制面板/管理工具/事件查看器 ->应用程序
双击错误信息,即可找到服务的错误提示。
5. 安装程序工具 (Installutil.exe)
安装程序工具使您得以通过在执行指定程序集中的安装程序组件来安装和卸载服务器资源。此工具与 System.Configuration.Install 命名空间中的类一起工作。
安转的位置和路径在:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
卸载的位置和路径在:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
安装程序工具 (Installutil.exe) 安装方法和参数:
安装程序工具 (Installutil.exe) 安装方法和参数:
installutil [/uninstall][option [...]]assemblyname ][option [...]]assemblyname
/h[elp]
显示该工具的命令语法和选项。
/help assemblypath
显示指定程序集中的个别安装程序所识别的任何附加选项。
/?
显示该工具的命令语法和选项。
/? assemblypath
显示指定程序集中的个别安装程序所识别的任何附加选项。
/LogFile=[filename]
指定在其中记录安装进度的日志文件的名称。默认文件名是 assemblyname.InstallLog。
/AssemblyName assemblyName
[,Version=major.minor.build.revision]
[,Culture=locale]
[,PublicKeyToken=publicKeyToken]]
指定程序集的名称。必须使用程序集的版本、区域性和公钥标记完全限定程序集名称。完全限定名必须用引号括起。
例如,“myAssembly, Culture=neutral, PublicKeyToken=0038abc9deabfle5, Version=2.0.0.0”是完全限定的程序集名称。
/LogToConsole={true|false}
如果为 true,则将输出显示到控制台。如果为 false(默认值),则取消将输出显示到控制台。
/ShowCallStack
如果在安装过程中的任何时候出现异常,则将调用堆栈打印到日志。
備註
可以在同一個命令行上指定多個程序集。出現在程序集名稱前面的任何選項應用於該程序集的安裝。為某個程序集指定的選項應用於後面的任何程序集,除非該選項與新程序集名稱一起指定。
Microsoft .NET Framework 應用程序由傳統的程序文件和關聯資源組成,如必須在部署應用程序時創建的消息隊列、事件日誌和性能計數器。安裝應用程序時可以使用程序集的安裝程序組件創建這些資源,而在卸載應用程序時可以使用這些組件刪除這些資源。Installutil.exe 檢測並執行這些安裝程序組件。
如果對某個程序集運行 Installutil.exe 但不指定任何選項,則 Installutil.exe 將下面三個文件放到該程序集的目錄中:
InstallUtil.InstallLog
包含安裝進度的常規說明。
assemblyname.InstallLog
包含安裝過程的提交階段特定的信息。有關提交階段的更多信息,請參見 Installer.Commit 方法。
assemblyname.InstallState
包含用於卸載該程序集的數據。
Installutil.exe 使用反射檢查指定的程序集並查找將 RunInstallerAttribute 設置為 true 的所有 Installer 類型。然後此工具在 Installer 類型的每個實例上執行 Install 方法或 Uninstall 方法。Installutil.exe 以事務性方式執行安裝;如果有一個程序集未能安裝,則 Installutil.exe 回滾其他所有程序集的安裝。卸載不是事務性的。
請註意,不能使用 Installutil.exe 來部署用 C++ 的托管擴展創建的 Windows 服務。Installutil.exe 無法識別由 C++ 編譯器產生的嵌入的本機代碼。如果試圖使用 Installutil.exe 來部署托管擴展 Windows 服務,則會引發異常(如 BadImageFormatException)。要處理這種情況,請將服務代碼移動到 C++ 的托管擴展模塊。然後,用 C# 或 Visual Basic 來編寫安裝程序對象。
示例
下列命令顯示命令語法和選項的說明。
installutil
下面的命令執行 myAssembly.exe 程序集中的安裝程序組件。
installutil myAssembly.exe
下面的命令執行 myAssembly.exe 程序集中的卸載程序組件。
installutil /u myAssembly.exe
下面的命令執行 myAssembly.exe 程序集中的安裝程序並指定將進度信息寫入 myLog.InstallLog 中。
installutil /LogFile=myLog.InstallLog myAssembly.exe
下面的命令將 myAssembly.exe 的安裝進度寫入 myLog.InstallLog 中,並將 myTestAssembly.exe 的進度寫入 myTestLog.InstallLog 中。
installutil /LogFile=myLog.InstallLog myAssembly.exe /LogFile = myTestLog.InstallLog myTestAssembly.
6. 通过部署工具安装
通过构建安装包实现安装,如果需要在安装后自动启动,则需要在ProjectInstaller中重载Commit方法
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
ServiceController sc = new ServiceController("CiLisInterface");
if(sc .Status.Equals(ServiceControllerStatus.Stopped))
{
sc.Start();
}
}
生成安装包后可以通过程序的唯一识别编号进行卸载,卸载方法为:
string sysroot = System.Enviorment.SystemDirectory;
Process Uninstall = new Process();
Uninstall.FileName= sysroot +"//msiexec.exe";
Uninstall.StartInfo.Arguments = "/x{程序的唯一识别} /qb";
Uninstall.Start();
7. 通过命令行快速部署
一、直接使用cmd来进行服务的一些操作
1、安装服务
sc create test3 binPath= "C:\Users\Administrator\Desktop\win32srvDemo\win32srvdemo\Debug\win32srvDemo.exe"
其中:test3为创建的服务名,binPath后面是运行exe文件的所在路径
2、配置服务
有以下集中方式:
sc config 服务名 start=AUTO (自动)
sc config 服务名 start= DEMAND (手动)
sc config 服务名 start= DISABLED(禁用)
例如下面的命令,在XP系统中开机便会自动启动:
sc config test3 start= AUTO
3、开启服务
net start test3
4、关闭服务
net stop test3
5、删除服务
sc delete test3
二、为方便使用,可编辑为bat批处理文件
(新建一个txt文件,自己命名,把后缀改为.bat文件)
1、创建、配置、开启服务
@echo.服务启动......
@echo off
@sc create test3 binPath= "C:\Users\Administrator\Desktop\win32srvdemo\win32srvdemo\Debug\win32srvdemo.exe"
@net start test3
@sc config test3 start= AUTO
@echo off
@echo.启动完毕!
@pause
2、关闭服务
@echo.服务关闭
@echo off
@net stop test3
@echo off
@echo.关闭结束!
@pause
3、删除服务
@echo.服务删除
@echo off
@sc delete test3
@echo off
@echo.删除结束!
@pause