演练:在组件设计器中创建 Windows 服务应用程序

http://msdn.microsoft.com/zh-cn/library/zt39148a(v=vs.80).aspx

演练:在组件设计器中创建 Windows 服务应用程序

.NET Framework 2.0
其他版本
5(共 5)对本文的评价是有帮助 评价此主题

 

Note注意

Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。

本主题中的步骤引导您完成创建简单的向事件日志写入消息的 Windows 服务应用程序的过程。创建和使用服务所执行的基本步骤包括:

  • 使用“Windows 服务”应用程序模板创建项目。此模板为您创建一个从 ServiceBase 继承的类,并编写大量基本服务代码,例如启动服务的代码。

  • 编写 OnStart 和 OnStop 过程的代码,并重写要重新定义的任何其他方法。

  • 添加服务应用程序所必需的安装程序。默认情况下,当单击“添加安装程序”链接时,一个包含两个或多个安装程序的类将被添加到应用程序中:一个用于安装进程,其他安装程序中的每一个用于项目包含的每个关联服务。

  • 生成您的项目。

  • 创建安装项目以安装服务,然后进行安装。

  • 访问 Windows 2000 服务控制管理器并启动您的服务。

首先,创建项目并设置服务正常运行所必需的值。

创建服务

创建并配置服务

  1. 在“文件”菜单上单击“新建项目”。

    打开“新建项目”对话框。

  2. 在 Visual Basic、Visual C#、Visual C++ 或 Visual J# 项目模板的列表中选择“Windows 服务”项目,并将其命名为 MyNewService。单击“确定”。

    Note注意

    项目模板自动添加从 System.ServiceProcess.ServiceBase 继承的名为 Service1 的组件类。

  3. 单击设计器选择 Service1。然后,在“属性”窗口中,将 Service1 的 ServiceName 和“(名称)”属性设置为“MyNewService”

  4. 将 AutoLog 属性设置为 true

  5. 在“视图”菜单中单击“代码”以打开“代码编辑器”。编辑 Main 方法以创建“MyNewService”的实例。当在步骤 3 中重命名服务时,未在 Main 方法中修改类名。在 Visual C# 和 Visual J# 应用程序中,Main 方法分别位于 Program.cs 和 Program.js 文件中。

    C#
    VB
    static void Main()
    {System.ServiceProcess.ServiceBase[] ServicesToRun;// Change the following line to match.ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
    J#
    public static void main(String[] args)
    {System.ServiceProcess.ServiceBase[] ServicesToRun;ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
向服务添加功能

在下一节中,您将把自定义事件日志添加到 Windows 服务中。事件日志与 Windows 服务没有任何形式的关联。此处,EventLog 组件用作可以添加到 Windows 服务的组件类型的示例。有关自定义事件日志的更多信息,请参见 如何:创建和移除自定义事件日志。

将自定义事件日志功能添加到服务中

  1. 在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。

  2. 从“工具箱”的“组件”选项卡,将 EventLog 组件拖到设计器中。

  3. 在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“查看代码”。

  4. 编辑构造函数以定义一个用户事件日志。

    C#
    VB
    public MyNewService()
    {InitializeComponent();if (!System.Diagnostics.EventLog.SourceExists("MySource")) {         System.Diagnostics.EventLog.CreateEventSource("MySource","MyNewLog");}eventLog1.Source = "MySource";eventLog1.Log = "MyNewLog";
    }
    J#
    public MyNewService()
    {InitializeComponent();if (!System.Diagnostics.EventLog.SourceExists("MySource")){System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");}eventLog1.set_Source("MySource");eventLog1.set_Log("MyNewLog");
    }

定义当服务启动时发生的情况

  • 在代码编辑器中,找到创建项目时被自动重写的 OnStart 方法,并编写代码来确定当服务开始运行时发生的情况:

    C#
    VB
    protected override void OnStart(string[] args)
    {eventLog1.WriteEntry("In OnStart");
    }
    J#
    protected void OnStart(String[] args)
    {eventLog1.WriteEntry("In OnStart");
    }
    Note注意

    服务应用程序设计为长时间运行。因此,它通常轮询或监视系统中的情况。监视是在 OnStart 方法中设置的。但是,OnStart 实际上不进行监视。一旦服务的操作开始,OnStart 方法必须返回到操作系统。它不能始终循环或阻止。若要设置简单的轮询机制,可以使用 System.Timers.Timer 组件。在 OnStart 方法中,可以设置组件上的参数,然后将 Enabled 属性设置为 true。然后,计时器将在代码中周期性地引发事件,此时,服务可以进行其监视工作。

定义当服务停止时发生的情况

  • 在“代码编辑器”中,从“方法名称”下拉列表中选择 OnStop 过程,该过程是创建项目时自动重写的。编写代码以确定服务停止时发生的情况:

    C#
    VB
    protected override void OnStop()
    {eventLog1.WriteEntry("In onStop.");
    }
    J#
    protected void OnStop()
    {eventLog1.WriteEntry("In onStop.");
    }

还可以重写 OnPause、OnContinue 和 OnShutdown 方法来定义对组件的进一步处理。

定义服务的其他操作

  • 对于要处理的方法,重写适当的方法并定义要发生的操作。

    下面的代码显示重写 OnContinue 方法时代码的情况:

    C#
    VB
    protected override void OnContinue()
    {eventLog1.WriteEntry("In OnContinue.");
    }  
    J#
    protected void OnContinue()
    {eventLog1.WriteEntry("In OnContinue.");
    }

安装 Windows 服务时需要执行某些自定义操作,这可以由 Installer 类来完成。Visual Studio 可以专门为 Windows 服务创建这些安装程序并将它们添加到项目中。

为服务创建安装程序

  1. 在“解决方案资源管理器”中,右击“Service1.vb”、“Service1.cs”或“Service1.jsl”,并选择“视图设计器”。

  2. 单击设计器的背景以选择服务本身,而不是它的任何内容。

  3. 设计器具有焦点时,右击然后单击“添加安装程序”。

    默认情况下,向您的项目添加包含两个安装程序的组件类。将该组件命名为 ProjectInstaller,它包含的安装程序分别是服务的安装程序和服务关联进程的安装程序。

  4. 在“ProjectInstaller”的“设计”视图中,单击“ServiceInstaller1”或“serviceInstaller1”。

  5. 在“属性”窗口中,将 ServiceName 属性设置为“MyNewService”

  6. 将 StartType 属性设置为 Automatic。

  7. 在设计器中单击“ServiceProcessInstaller1”(对于 Visual Basic 项目)或“serviceProcessInstaller1”(对于 Visual C# 或 Visual J# 项目)。将 Account 属性设置为 LocalService。这将使得在本地服务帐户上安装和运行该服务。

    Security note安全注意

    LocalService 帐户用作本地计算机上的非特权用户,向任何远程服务器显示匿名凭据。使用其他帐户时需要特别小心,因此它们具有较高的特权,会增加您受到恶意代码攻击的风险。

生成服务项目

  1. 在“解决方案资源管理器”中,右击选择您的项目并从快捷菜单中选择“属性”。出现项目的“属性设计器”。

  2. 从“应用程序”页的“启动对象”列表中选择“MyNewService”。

  3. 按 Ctrl+Shift+B 生成项目。

生成项目后,便可以对其进行部署了。安装项目将安装已编译的项目文件并运行要运行 Windows 服务所需的安装程序。若要创建完整的安装项目,您需要将项目输出 MyNewService.exe 添加到安装项目,然后添加自定义操作来安装 MyNewService.exe。有关安装项目的更多信息,请参见 安装项目。有关自定义操作的更多信息,请参见 演练:创建自定义操作。

为服务创建安装项目

  1. 在“解决方案资源管理器”中,右击选择解决方案,指向“添加”,然后单击“新建项目”。

  2. 在“项目类型”窗格中选择“安装和部署项目”文件夹。

  3. 在“模板”窗格中选择“安装项目”。将项目命名为 MyServiceSetup。单击“确定”。

    安装项目随即添加到解决方案。

然后,将 Windows 服务项目的输出 MyNewService.exe 添加到安装项目中。

向安装项目添加 MyNewService.exe

  1. 在“解决方案资源管理器”中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”。

    出现“添加项目输出组”对话框。

  2. 并且在“项目”框中选择了“MyNewService”。

  3. 在列表框中,选择“主输出”,再单击“确定”。

    MyNewService 的主输出的项目项被添加到安装项目中。

现在添加自定义操作以安装 MyNewService.exe 文件。

向安装项目添加自定义操作

  1. 在“解决方案资源管理器”中右击安装项目,指向“视图”,再选择“自定义操作”。

    出现“自定义操作”编辑器。

  2. 在“自定义操作”编辑器中右击“自定义操作”节点,再选择“添加自定义操作”。

    出现“选择项目中的项”对话框。

  3. 在列表框中双击“应用程序文件夹”以将其打开,选择“MyNewService 的主输出(活动)”,再单击“确定”。

    主输出被添加到自定义操作的所有四个节点:“安装”、“提交”、“回滚”和“卸载”。

  4. 在“解决方案资源管理器”中,右击“MyServiceSetup”项目并选择“生成”。

安装 Windows 服务

  1. 若要安装“MyNewService.exe”,请右击“解决方案资源管理器”中的安装项目,再选择“安装”。

  2. 完成“安装向导”中的步骤。生成并保存您的解决方案。

启动和停止服务

  1. 通过执行下列操作之一打开服务控制管理器:

    • 在 Windows XP 和 2000 专业版中,在桌面上右击“我的电脑”,再单击“管理”。在“计算机管理”控制台中,展开“服务和应用程序”节点。

      - 或 -

    • 在 Windows Server 2003 和 Windows 2000 Server 中,单击“开始”,指向“程序”,单击“管理工具”,然后单击“服务”。

      Note注意

      在 Windows NT 4.0 版中,可以从“控制面板”中打开此对话框。

    现在应该看到“MyNewService”列在窗口的“服务”区域中。

  2. 从列表中选择您的服务,右击该服务,然后单击“启动”。

  3. 右击该服务,再单击“停止”。

验证服务的事件日志输出

  1. 打开“服务器资源管理器”并访问“事件日志”节点。有关更多信息,请参见 如何:在服务器资源管理器中使用事件日志。

    Note注意

    Visual Studio 标准版中不提供“Windows 服务”模板及相关功能。有关更多信息,请参见 Visual Studio 版本。

  2. 找到 MyNewLog 的列表并展开它。您应该看到服务所执行操作的项。

卸载服务

  1. 在“开始”菜单上打开“控制面板”并单击“添加/删除程序”,再找到您的服务并单击“卸载”。

  2. 还可以通过右击 .msi 文件的程序图标并选择“卸载”来卸载该程序。

    Note注意

    如果在 Windows 2000 上安装了服务,则需要重新启动系统才能重新安装服务。在 Windows 2000 中,服务在系统重新启动之前不会完全删除。

后续步骤

可以利用 ServiceController 组件将命令发送到已安装的服务。有关使用 ServiceController 控件的更多信息,请参见 监视 Windows 服务。

可以在安装应用程序时使用安装程序创建事件日志,而不是在运行应用程序时创建事件日志。此外,在卸载应用程序时,事件日志将被安装程序删除。有关更多信息,请参见 演练:安装事件日志组件。

请参见

任务

如何:将安装程序添加到服务应用程序 
如何:安装和卸载服务 
如何:调试 Windows 服务应用程序 
如何:启动事件查看器 

参考

如何:访问和初始化服务器资源管理器/数据库资源管理器 

概念

Windows 服务应用程序介绍 

其他资源

Windows 服务应用程序

转载于:https://www.cnblogs.com/xust/articles/2736612.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绝对震撼 7款HTML5动画应用及源码

除非特别声明,PHP100新闻均为原创或投稿报道,转载请注明作者及原文链接 原文地址: http://www.php100.com/html/it/mobile/2014/0702/7030.html [导读] 关于HTML5动画,我们已经分享太多了,当然也有很多利用纯CSS3实现的…

maven打包指定main函数

2019独角兽企业重金招聘Python工程师标准>>> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> …

简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

本文实例为大家分享了java版贪吃蛇小游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下项目结构新建一个JFrame窗口,作为程序入口public class GameStart{public static void main(String[] args) {JFrame jFrame new JFrame();jFrame.setBounds(100,100,900,720…

java切入式编程显示屏_C语言嵌入式系统编程修炼之四:屏幕操作

C语言嵌入式系统编程修炼之四:屏幕操作作者:宋宝华 更新日期:2005-07-22汉字处理现在要解决的问题是&#xff0c;嵌入式系统中经常要使用的并非是完整的汉字库&#xff0c;往往只是需要提供数量有限的汉字供必要的显示功能。例如&#xff0c;一个微波炉的LCD上没有必要提供显…

算法之矩阵计算斐波那契数列

算法之矩阵计算斐波那契数列 本节内容 斐波那契介绍普通方式求解斐波那契矩阵概念矩阵求幂矩阵求解斐波那契1.斐波那契介绍 斐波那契数列有关十分明显的特点&#xff0c;那是&#xff1a;前面相邻两项之和&#xff0c;构成了后一项。即f(n)f(n-1)f(n-2),f(0)0,f(1)f(2)1,推导下…

SeekBar和RatingBar

1. SeekBar的主要属性 2. OnSeekBarChangeListener 3. RatingBar的主要属性 4. OnRatingBarChangeListener 1. SeekBar的主要属性 2. OnSeekBarChangeListener 1 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tools&qu…

用“Web的思想”做PC客户端

一直在想&#xff0c;用HTML搭建前端页面这么方便&#xff0c;而且效果这么炫&#xff0c;为什么在PC端的软件要如此麻烦呢&#xff1f;就连C#也是&#xff0c;更何况C了。 尽管C有DirectUI这样优秀的图形库&#xff0c;但是开发起来仍然非常吃力。C#的WPF虽然工具链完善&#…

Java并发中常用同步工具类

为什么80%的码农都做不了架构师&#xff1f;>>> 同步工具类可以是任何一个对象&#xff0c;只要它根据其自身的状态来协调线程控制流。阻塞队列&#xff08;BlockingQueue&#xff09;可以作为同步工具类&#xff0c;其他类型的同步工具类还包括信号量&#xff08;…

RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播

RTMP协议发送H.264编码及AAC编码的音视频&#xff0c;实现摄像头直播 摘要: RTMP协议发送H.264编码及AAC编码的音视频&#xff0c;实现摄像头直播  RTMP&#xff08;Real Time Messaging Protocol&#xff09;是专门用来传输音视频数据的流媒体协议&#xff0c;最初由Macrome…

jenkins 部署文档

Jenkins是一个非常出色的持续集成服务器&#xff0c;本文主要介绍在CentOS系统中Jenkins的基本安装配置方法&#xff0c;供参考。一. 软件包&#xff1a;1. 下载apache-maven-2.2.1-bin.tarhttp://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz…

牛人,多看看他们写的东西

计算机大师 Donald E. Knuth&#xff08;高德纳&#xff09; 算法大师&#xff0c;我最崇拜的计算机科学家&#xff0c;没有之一&#xff01;不认识高爷爷的人别说自己是学计算机的。《The Art of Computer Programming》绝对是计算机科学的圣经。对高爷爷的崇敬&#xff0c;对…

20121108团队博客(苏若)

PS&#xff1a;这本是属于昨晚的帖子&#xff0c;对不住忠仔。现在补上。 忠仔&#xff0c;终于交给了我一个实实在在的任务&#xff0c;很是欣喜&#xff0c;也很是忐忑&#xff0c;生怕自己不能及时完成任务。 好了&#xff0c;废话不多说&#xff0c;步入正题。 接下任务【画…

textedit怎么插入数据_还在手动插入Excel交叉空白行?这个小技巧10秒搞定

导读&#xff1a;前几天有同学在后台提问&#xff0c;怎么快速在Excel中隔行插入一行或者多行空白行&#xff0c;其实在早期我们分享的小视频中有利用过类似的小技巧来制作工资条&#xff0c;今天我们用它来插入空白行。文/ 芒种学院指北针Hello&#xff0c;大家好&#xff0c;…

rocketmq 启动_016【windows版Rocketmq】小白学习Rocketmq单机部署

以前都是听说MQ&#xff0c;或者在别人搭建好的基础上去使用&#xff0c;没有自己动手搭建过&#xff0c;就没有更深入去理解。现在机会来啦.啦啦.啦啦啦......引用自己的CSDN文章href"https://blog.csdn.net/chenzhong2010/article/details/106699590或点击左下角“阅读原…

WPF WebBrowser 加载 html ,出现安全警告, 运行 脚本和 activeX 控件,

对于你的问题&#xff0c;只需要在你的HTML首行添加如下代码即可隐藏安全提示条&#xff1a; <!-- saved from url(0014)about:internet --> 还有一个可选方案是使用Winform的WebBrowser控件&#xff0c;不需要更改HTML代码&#xff0c;也不会出现安全提示&#xff0c;需…

php异步处理下载文件,异步处理Excel文件导入【流程图+PHP示例】

面向管理后台的系统中&#xff0c;经常会有文件导入的需求。常规的做法就是同步等待&#xff0c;但在业务关系复杂(多表数据校验)、数据量较大的情况下&#xff0c;管理人员只能等结果&#xff0c;也可能会等到超时。使用异步的话&#xff0c;将导入数据的功能与后端接口解耦&a…

php 简易 blog,PHP实现简易blog的制作

最近&#xff0c;有时间看了点PHP的代码。参考PHP100教程做了简单的blog&#xff0c;这里面简单的记录一下。首先是集成环境&#xff0c;这里选用的WAMP&#xff1a;http://www.wampserver.com/en/首先通过&#xff0c;phpMyAdmin创建一张blog表。纯界面操作&#xff0c;过程比…

离散数学反对称关系_《离散数学》学习记录 - 集合论

来源&#xff1a;北京大学《离散数学》公开课地址&#xff1a;https://www.bilibili.com/video/av18896337/?p122.1 有序对和卡氏积有序对<a,b>&#xff1a;有顺序&#xff0c;类似于数组&#xff0c;可以用集合定义。性质&#xff1a;有序对内元素对应相等卡氏积AB&…

php创建表并插入数据,php数据库操作-创建库和表以及插入数据

以上我们正确连接到了mysql数据库&#xff0c;本文将进一步创建数据库&#xff0c;表&#xff0c;在表中填充数据。大家知道连接上数据库才能进行操作&#xff0c;同样的代码搬过来/** 数据库操作*(创建数据库&#xff0c;表&#xff0c;插入数据&#xff0c;插入多条数据)** T…

mysql触发器 当记录的指定字段发生变化时,更新表中的另外一个字段,或者更新另外一张关联表中关联记录的字段...

2019独角兽企业重金招聘Python工程师标准>>> 注意&#xff1a;语句中出现的old&#xff0c;new&#xff0c;now&#xff08;&#xff09;&#xff0c;都为数据库自带的关键字&#xff0c;此处不做解释。 两种情况&#xff1a; 第一种&#xff1a;一张表中&#xff0…