构建Windows服务最简单的语言是什么?
在这种情况下,最简单的将被定义为最少的代码量,以及进入该语言的最低点.
如果您有任何C/C++/Java背景,那么冒着明显的风险,我认为C#为您提供最低的入口点.
假设您使用的是Visual Studio 2008,则可以按照以下步骤操作:
打开Visual Studio 2008,然后选择"文件"|"新建"|"项目"菜单选项.
在"新建项目"对话框中...
在项目类型中选择Visual C#| Windows节点
选择Windows服务模板
输入项目的名称和位置
按确定
此时,您拥有Windows服务的所有基础知识.Program.cs文件包含服务的Main()方法,Service1.cs定义作为新Windows服务的System.ServiceProcess.ServiceBase组件.
在Service1组件的Property Grid中,请考虑至少设置以下属性:
(名称) - 为您的对象提供直观的名称,例如ServiceExample
AutoLog - 设置为false
阻止事件默认写入应用程序事件日志(注意:我不是说你不应该记录服务事件;我只是想写入我自己的事件日志而不是应用程序日志 - 见下文)
CanShutdown - true
如果要处理系统关闭,则设置为
ServiceName - 定义服务控制管理器(SCM)知道服务的名称
在ServiceExample的代码中,OnStart()和OnStop()虚函数被删除.您需要填写这些内容,无论您的服务需要做什么.如果您将CanShutdown属性更改为true
,则还需要覆盖OnShutdown方法.我在下面创建了一个示例,说明了这些函数的用法.
此时,ServiceExample服务基本上已完成,但您仍需要一种方法来安装它.为此,请在设计器中打开ServiceExample组件.右键单击设计器面板中的任意位置,然后选择"添加安装程序"菜单选项.这会将ProjectInstaller组件添加到项目中,该组件包含两个附加组件 - serviceProcessInstaller1和serviceInstaller1.
在设计器中选择serviceProcessInstaller1组件.在Property Grid中,考虑设置以下属性:
(名称) - 为您的对象提供直观的名称,例如serviceProcessInstaller
帐户 - 至少选择LocalService帐户,但如果您的服务需要更多权限,则可能必须使用NetworkService或LocalSystem帐户
在设计器中选择serviceInstaller1组件.在Property Grid中,考虑设置以下属性:
(名称) - 为对象提供直观的名称,例如serviceInstaller
描述 - 服务的描述,将在SCM中显示给您的服务
DisplayName - 您的服务的友好名称,它将显示在您的服务的SCM中
ServiceName - 确保这与您为ServiceExample组件的ServiceName属性选择的名称相同(请参阅步骤4)
StartType - 指示您是希望自动还是手动启动服务
请记住,我说我更喜欢将事件写入我自己的事件日志而不是应用程序事件日志.为此,您需要使用自定义项替换ProjectInstaller中的默认EventLogInstaller.使ProjectInstaller的代码如下所示:
using System.Diagnostics; [RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); EventLogInstaller installer = FindInstaller(this.Installers); if (installer != null) { installer.Log = "ServiceExample"; // enter your event log name here } } private EventLogInstaller FindInstaller(InstallerCollection installers) { foreach (Installer installer in installers) { if (installer is EventLogInstaller) { return (EventLogInstaller)installer; } EventLogInstaller eventLogInstaller = FindInstaller(installer.Installers); if (eventLogInstaller != null) { return eventLogInstaller; } } return null; } }
此时,您可以构建项目以使Windows服务可执行.要安装服务,请打开Visual Studio 2008命令提示符,然后导航到可执行文件所在的Debug或Release目录.在命令提示符下,键入以下内容: InstallUtil ServiceExample.exe.这将在本地计算机上安装您的服务.要卸载它,请在命令提示符处键入以下内容: InstallUtil/u ServiceExample.exe
只要您的服务未运行,您就可以对服务进行更改并重新构建,即您不必卸载服务即可对其进行更改.但是,只要它正在运行,您将无法使用修复程序和增强功能覆盖可执行文件.
要查看您的服务,请打开ServiceExample.cs文件并进行以下更改:
using System.Diagnostics; public partial class ServiceExample : ServiceBase { public ServiceExample() { // Uncomment this line to debug the service. //Debugger.Break(); InitializeComponent(); // Ties the EventLog member of the ServiceBase base class to the // ServiceExample event log created when the service was installed. EventLog.Log = "ServiceExample"; } protected override void OnStart(string[] args) { EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information); } protected override void OnStop() { EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information); } protected override void OnShutdown() { EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information); } }
使用这些更改运行服务后,您可以在事件查看器中查看ServiceExample事件日志,并查看其中记录的消息.
希望这可以帮助.
编辑:如果您更喜欢使用应用程序事件日志来进行事件日志记录而不是自定义事件日志,则只需对ProjectInstaller.cs文件不进行任何更改.此外,省略在ServiceExample构造函数中设置EventLog的Log属性的行.运行服务时,日志消息将显示在应用程序事件日志中.