.net Windows服务程序和安装程序制作图解
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自己成功制作的方式贴出来,一方面留给自己,一方面也希望能给遇到同样问题绝望中不能自拔、以致失去灵魂的路人甲,路人乙一还魂丹 . . .
IDE :WIN2003 VS2008 SQL2005
一、创建window服务项目
首先我们建一个window服务项目 :解决方案(右击)——> 增加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图:
二、编写Window服务程序
向导向工程文件中增加Service1.cs类:
其中各属性的含意是:
Autolog 是否自动写入系统的日志文件
CanHandlePowerEvent 服务时候接受电源事件
CanPauseAndContinue 服务是否接受暂停或继续运行的请求
CanShutdown 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程 CanStop 服务是否接受停止运行的请求
ServiceName 服务名
创建后会生成两个文件 Program.cs 和 Service1.cs ,其中 program.cs 这个文件不用动,里面已自动生成好了。我们在Service1.cs里增加所要的操作,里面有两个重写方法 OnStart 和 OnStop ,OnStart 方法表示服务启动的操作,OnStop 表示服务停止的操作,下面写了一个简单示例 :当服务启动后,调用远程一个WebService的Hello函数,并把返回的值写入到一个文件中。code如下:
/// <summary>/// 服务启动的操作/// </summary>/// <param name="args"></param>protected override void OnStart(string[] args) {StartHello();}/// <summary>/// 服务停止的操作/// </summary>protected override void OnStop(){try{ThreadHello.Abort();Flag = false;System.Diagnostics.Trace.Write("线程停止");}catch (Exception ex){System.Diagnostics.Trace.Write(ex.Message);}}private Thread ThreadHello;private void StartHello(){try{// 标准形式//ThreadStart NewThreadStart = new ThreadStart(VoidName);//Thread NewThead = new Thread(NewThreadStart);//NewThead.Start();ThreadHello = new Thread(new ThreadStart(Hello));ThreadHello.Start();System.Diagnostics.Trace.Write("线程任务开始");}catch (Exception ex){System.Diagnostics.Trace.Write(ex.Message);throw ex;}}private void Hello(){while (Flag){localhost.AdvService la = new WindowsService1.localhost.AdvService();try{string helloname = la.Hello("Andy"); // 调用远程WebService中的方法writeInLog(helloname, false); // 把调用返回的数据写入到文件中}catch (Exception ex){System.Diagnostics.Trace.Write(ex.Message);throw ex;}Thread.Sleep(5000);}}/// <summary>/// 写入文件操作/// </summary>/// <param name="msg">写入内容</param>/// <param name="IsAutoDelete">是否删除</param>private void writeInLog(string msg, bool IsAutoDelete){try{string logFileName = @"E:\Sample\PG_Sample\log.txt"; // 文件路径FileInfo fileinfo = new FileInfo(logFileName);if (IsAutoDelete){if (fileinfo.Exists && fileinfo.Length >= 1024){fileinfo.Delete();}}using (FileStream fs = fileinfo.OpenWrite()){StreamWriter sw = new StreamWriter(fs);sw.BaseStream.Seek(0, SeekOrigin.End);sw.WriteLine("=====================================");sw.Write("添加日期为:" + DateTime.Now.ToString() + "\r\n");sw.Write("日志内容为:" + msg + "\r\n");sw.WriteLine("=====================================");sw.Flush();sw.Close();}}catch (Exception ex){ex.ToString();}}
例子很简单,方便理解,上面通过线程,每5秒执行一次操作,到这里,我们的服务以及服务实现的功能就已经写好了,下面怎么让客户端安装我们的服务呢?这里才是我写这篇文章的目的!先要增加一个安装程序类,切换到视图窗口,右击——>增加安装程序,便会增加一个程序安装类文件 ProjectInstaller.cs,如图:
这里serviceProcessInstaller1 和 serviceInstaller1 有几个重要属性要设置,serviceInstaller1 中的StartType要设置成Automatic,表示随机启动,ServiceName表示服务名称,Description 表示服务的描述, DisplayName 表示显示名称。serviceProcessInstaller1 中的Account要设置成LocalSystem,表示本地系统帐号
C# 安装布署 及Windows服务自动启动
设置serviceInstaller1控件的StartType属性为"Automatic"
在服务器上添加安装程序,在 private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) 事件中,添加以下代码:
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
string Cmdstring = "sc start myservice"; //CMD命令 myservice服务名称
p.StandardInput.WriteLine(Cmdstring);
p.StandardInput.WriteLine("exit");
即可在安装服务后立刻启动windows服务
Window服务的安装有两个方式:
一、命令安装
由于我们是安装服务,就不需要用户桌面和程序菜单了,直接应用程序文件夹(右击)——> 增加 ——> 项目输出 入图 :
上面有两点需要注意 ,一 项目选择中选择要安装的服务, 二 项目选择下面要选择主输出,选择好后确定,这一步增加了安装程序的文件夹,下一步就是给这个安装程序增加操作,这里我们增加两个基本操作,一个是安装,一个是卸载。安装项目(右击) ——> 视图 ——> 自定义操作 如图
上面可以看到有安装,提交,回滚,卸载等操作,我们先增加安装操作,安装(右击)——> 增加自定义操作,会弹出一个对话 如图:
选择应用程序文件夹,并选中之前增加的主输出项,确定,这样这个安装程序就增加了安装的操作,同样按照这样的方式增加卸载操作,卸载与安装唯一不同的是需要设置一个命令参数,不可少,如图:
这里 Arguments 里输入 /u 表示卸载命令相当于 InstallUtil.exe /u 服务路径 , 到这里 ,我们的安装程序就已经制作好了,生成安装程序项目,将会生成 setup.exe 和 setup.msi 安装文件,拷贝到客户端,点击setup.exe 就像安装QQ一样安装我们的服务,实际上比QQ好多了,QQ还有广告,我们可是纯绿色的!
--------------------------------------------------------------------------------------
1.创建 windows服务 项目 文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服务"
2.系统已经为我们建立了一个 Service1.cs 组件,测试时我们就用它了. 如果要新件的话,右键项目 -> 添加 -> 新建项 -> windows 服务。
3.在 Service1.cs 上 ,按 F7 (右键查看代码),打开代码页。加入我们测试用的代码。 注意:下面的几个方法中的 str 变量,为了我们一会儿调试时设置断点用的!
using System;using System.Diagnostics;using System.ServiceProcess;namespace WindowsService1{public partial class Service1 : ServiceBase{public Service1(){InitializeComponent();InitService();}/// <summary>/// 初始化服务参数/// </summary>private void InitService(){base.AutoLog = false;base.CanShutdown = true;base.CanStop = true;base.CanPauseAndContinue = true;base.ServiceName = "Service1"; //这个名字很重要,设置不一致会产生 1083 错误哦!}protected override void OnStart(string[] args){string str ="服务开启";}protected override void OnStop(){string str ="服务停止";}protected override void OnContinue(){string str ="服务继续运行";base.OnContinue();}protected override void OnPause(){string str ="服务暂停";base.OnPause();}}}
4.建立服务的“安装程序” 4.1 双击”Service1.cs“,打开 Service1.cs 的视图设计器 4.2 在视图设计器中任意位置右键,选择”添加安装程序“ 4.3 这时项目跟目下将出现一个 ProjectInstaller.cs 的组件 (如果是第一次添加”安装程序“的话) 4.4 双击 ProjectInstaller.cs 打开 ProjectInstaller 的视图设计器 4.5 找到 serviceInstaller1 组件,选中后按 F4 键,设置组件属性。 Description=“测试服务1”; DisplayName=“Service1”; ServiceName=“Service1”;//这个值必须和 WindowsService1.InitService() 方法下设置的 base.ServiceName 属性一至。 StartType 为服务运行类型,根据你的需要设置即可。(Manual:手动启动,AutoMatic 为自动启动) 4.6 找到 serviceProcessInstaller1 组件,选中后按 F4 键,设置组件属性。 Account=“LocalSystem”; //设置为其他的属性在开启服务时,会提示输入用户名和密码 4.7 这样就完成了一个服务的所有准备,下面就是安装和测试工作。
5.生成组件 右键项目,选择“生成”。
6.安装组件 6.1 使用 InstallUtil.exe 工具注册组件服务,文件位置在不同版本的 framework 中。我用的是 4.0 所以在一下位置 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 6.2 打开生成目录,如果生成成功会有一个 WindowsService1.exe 文件 6.3 在生成目录根目录下新加两个 bat(批处理文件),用于安装和卸载服务 新建一个文本文件,打开文件加入以下两行命令 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WindowsService1.exe pause 保存后关闭文本文件,之后将其重命名为“安装服务.bat”文件,注意要修改后缀名为 .bat!
再新建一个文本文件,打开文件加入以下两行命令 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u WindowsService1.exe pause 保存后关闭文本文件,之后将其重命名为“卸载服务.bat”文件,注意要修改后缀名为 .bat! 6.4 “安装服务.bat”文件,安装windows 服务
7.安装成功后需要手动开启服务,因为我们刚设置 serviceInstaller1.StartType 为 Manual 打开windows 服务管理器,找到名为 Service1 的服务,右键属性。点击【启动】按钮
8.windows 调试 8.1 回到开发环境,选择调试->附加到进程,勾选”显示所有用户进程“ 8.2 找到 WindowsService1.exe 进程(如果没有点击下刷新按钮),选中后点击“附加到进程”按钮。 8.3 选中 Service1.cs 文件,后按 F7 打开代码视图 8.4 在所有 str 变量上添加调试断点 8.5 回到windows服务管理器,找 Service1 服务并选中它,在左侧有一个“暂停”按钮。点击一下 这时,OnPause 方法下的断点命中!OK 达到了调试的目的了
9.如果想一次安装多个服务,需要按照 2~5 的步骤多添加几个服务就好了! -------------------------------------------------------------------------------------- 问题及解决方案 注册成功后,启动 Windows服务 时遇到错误:1083 的解决办法 1.查看 Main() 方法中是否启动了指定的服务 ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new Service1(), new Service2() //如果建立多个服务需要添加这段代码 }; ServiceBase.Run(ServicesToRun);
2.确保 ProjectInstaller.cs 视图设计器中的 serviceInstaller1 组件的 ServiceName 属性 与 Service1.cs 组件的 ServiceName 属性一致
转载于:https://www.cnblogs.com/tjy9999/p/3660155.html
.net Windows服务程序和安装程序制作图解相关推荐
- vb6.0安装程序制作图解教程
如何制作vb安装程序,是在学习Vb6.0过程中比较常见的一个入门问题. 在此笔者介绍一个最简单的安装方法,就是用VB自带的打包程序进行打包,虽然比较普通,不过内部却有不少窍门,相信这一点知道的人可能不 ...
- NSIS(Nullsoft Scriptable Install System)开源安装程序制作软件使用详细步骤(Windows系统下)
NSIS(Nullsoft Scriptable Install System)开源安装程序制作软件使用详细步骤(Windows系统下)安装包制作 1.软件详情 软件版本 版本说明 翻译跟进 2.教程 ...
- windows 服务程序和桌面程序集成(一)
本系列文章介绍如何将windows服务程序和桌面程序集成在一起,也就是说一个EXE程序,既可以作为服务程序运行,也可以作为桌面程序运行的双模程序. 在十几年前,曾经给客户开发一套C/S架构的出单程序, ...
- VC++ 安装程序制作
VC++ 安装程序制作 2009-10-25 10:40 当用VC++完成应用程序的编制后,如果不为它制作一个安装程序,似乎感到缺少一点什么, 你也许急于到市面找制作安装程序的工具,如"Cr ...
- Java安装程序制作工具
Java安装程序制作工具 IzPack 是一个 Java 安装程序制作工具,能够制作一些简单的安装程序.制作出来的安装程序能在 Unix-like, MacOS X, Windows 等系统平台上运行 ...
- 一键安装,双击运行——Java安装程序制作
如果您喜欢这些文章,欢迎点击此处订阅本Blog <script type="text/javascript"></script> <script sr ...
- 关于安装程序制作的简明教程(一)
关于安装程序制作的简明教程(一) Vitamin C[抗坏血酸].2002.3.11.ZJ.GD.CHI. 前段时间我完成了几个软件的汉化,想把它们打包起来,可是苦于我是一个很菜的鸟,很笨的瓜,只好上 ...
- Windows 下OpenSSL 安装详解 +图解
Windows 下OpenSSL 安装详解 +图解 转载于:https://www.cnblogs.com/zhujiabin/p/5088646.html
- C# 安装程序制作,如何添加第三方DLL以及自定义的文件夹(如uploadFiles 文件夹)
项目基本的安装程序制作,可参考: http://blog.csdn.net/kezhen/article/details/17732615 http://blog.csdn.net/kezhen/ar ...
最新文章
- java添加窗体_添加的窗体
- B - 一只小蜜蜂...
- Leetcode771.Jewels and Stones宝石与石头
- 深度剖析数据中台提供的数据服务
- 3371 【模板】单源最短路径(Dijsktra)
- UCF101数据集处理
- web 打印实用控件 lodop
- alibaba人一起写过的技术丛书
- 优秀不够,你是否无可替代
- Docker容器离线安装字体(宋体)
- java 虚拟机 Java内存结构 JVM垃圾回收机制算法
- 【基础教程】Python整数类型(int)详解
- 浅谈电子配线架智能布线管理系统(二)
- 2021年最适合上班族的25个副业,男女通用!
- 安装最新的文泉驿字体[z]
- Django2.0官方文档--概览
- 信心恒心耐心爱心包容心平常心
- 西门子plc程序备份项目服务器,如何备份程序
- EndNote两台电脑同步library
- JAVE获取视频文件属性信息(比较全)
热门文章
- java怎么运行class文件,面试必会
- python【蓝桥杯vip练习题库】ALGO-1区间k大数查询
- MySQL-数据库和表的基本操作
- ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...
- win10定时关机c语言,Win10系统怎么定时关机?Windows10设置定时关机的两种方法
- vue hot true 不起作用_从源码解读 Vuex 注入 Vue 生命周期的过程
- 骂骂咧咧的 fastreport 数据隔行换色
- Windos 10 下,应用版ubuntu系统, 访问windos文件系统
- 如何提升网站在搜索引擎中的排名?
- 浅析SEO优化分类信息网站优化的三大技巧