.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();
}
} /// <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 >= )
{
fileinfo.Delete();
}
}
using (FileStream fs = fileinfo.OpenWrite())
{
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(, 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服务自动启动

 
设置serviceProcessInstaller1控件的Account属性为“LocalSystem”
设置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服务的安装有两个方式:

一、命令安装

       通过命令窗口,执行 InstallUtil.exe 服务路径 可安装Window服务,你是不是觉得我在扯,这么长的命令怎么看?怎么记住?可以想想如果客户端是一个不懂程序的人是不可能自己完成安装的,那么能不能制作一个简单有效,点点按钮可以安装的呢,答案是肯定的 ——> 安装程序制作
       二、安装程序
       安装程序制作 :解决方案(右击)——> 增加 ——> 新建项目 ——> 项目类型选择安装和部署 ——>  模板选择安装项目   如图 :
 
     创建后,安装项目(右击) ——> 视图 ——> 文件系统 如图:
 

由于我们是安装服务,就不需要用户桌面和程序菜单了,直接应用程序文件夹(右击)——> 增加 ——> 项目输出 入图 :

上面有两点需要注意 ,一 项目选择中选择要安装的服务, 二 项目选择下面要选择主输出,选择好后确定,这一步增加了安装程序的文件夹,下一步就是给这个安装程序增加操作,这里我们增加两个基本操作,一个是安装,一个是卸载。安装项目(右击) ——> 视图 ——> 自定义操作 如图

上面可以看到有安装,提交,回滚,卸载等操作,我们先增加安装操作,安装(右击)——> 增加自定义操作,会弹出一个对话 如图:

选择应用程序文件夹,并选中之前增加的主输出项,确定,这样这个安装程序就增加了安装的操作,同样按照这样的方式增加卸载操作,卸载与安装唯一不同的是需要设置一个命令参数,不可少,如图:

这里 Arguments 里输入 /u  表示卸载命令相当于 InstallUtil.exe /u 服务路径  , 到这里 ,我们的安装程序就已经制作好了,生成安装程序项目,将会生成 setup.exe 和 setup.msi 安装文件,拷贝到客户端,点击setup.exe 就像安装QQ一样安装我们的服务,实际上比QQ好多了,QQ还有广告,我们可是纯绿色的!

 
在一个应用程序中创建多个 windows 服务的方法和 1083 的解决办法 错误解决方案

--------------------------------------------------------------------------------------

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 属性一致

.net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)的更多相关文章

  1. .net Windows服务程序和安装程序制作图解

    最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...

  2. vb6.0安装程序制作图解教程

    如何制作vb安装程序,是在学习Vb6.0过程中比较常见的一个入门问题. 在此笔者介绍一个最简单的安装方法,就是用VB自带的打包程序进行打包,虽然比较普通,不过内部却有不少窍门,相信这一点知道的人可能不 ...

  3. VS安装程序制作之MSI/EXE

    MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装(和卸载)程序所需的指令和数据.MSI文件将程序的组成文件与功能关联起来 ...

  4. 基于NSIS脚本开发的安装程序制作软件:易量安装

    原文 基于NSIS脚本开发的安装程序制作软件:易量安装 前几天“萝卜”给我推荐了一款安装程序制作工具——易量安装. 易量安装是一款安装程序制作软件,基于著名的NSIS(Nullsoft Scripta ...

  5. 安装程序配置服务器失败。参考服务器错误日志和C:\windows\sqlstp.log 了解更多信息

    重装sql经常遇到2个问题 1,以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机. 删除C:\Program Files\Microsoft SQL Serve ...

  6. NSIS安装程序制作工具判断系统是否安装.NET

    前段时间忙了很久的系统总算上线了,由于是WinForm程序不能整个文件夹的发给客户使用.所以必须要打包,记得以前在VS2005中是自带部署功能的.现在换了VS2013那个部署功能完全弄不清方向.最后在 ...

  7. php通用安装程序,导入数据文件(.sql)的安装程序

    php通用安装程序,导入数据文件(.sql)的安装程序 该程序只需要1个php文件 和 1个数据文件,很方便调用.install/index.php         程序文件install/mycms ...

  8. Windows服务程序和安装程序制作

    转:http://www.cr173.com/html/15350_1.html 本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建 ...

  9. Java安装程序制作

    对于Java桌面应用来说,比较烦琐的就是安装部署问题,如:客户端是否安装有jre.jre版本.jre在哪里下载.如何用jre启动 Java应用等等.不要说刚接触电脑的人,就算是比较熟悉电脑,如果没有接 ...

随机推荐

  1. [转载]char * 和char []的区别---之第一篇

    char *  和char []的区别---之第一篇 原文地址http://blog.csdn.net/yahohi/article/details/7427724 在C/C++中,指针和数组在很多地 ...

  2. 我是IT小小鸟

    我是IT小小鸟读后感 世界上没有一蹴而就的成功者,只有头悬梁锥刺股的奋斗者.蜉蝣向往大鹏的辉煌,却不曾知大鹏以往的汗水.蜉蝣之所以为蜉蝣,是因为它犹如井底之蛙,目光短浅,之盲目地羡慕成功者,而大鹏之所 ...

  3. [noip2010]关押罪犯 并查集

    第一次看的时候想到了并查集,但是不知道怎么实现: 标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的巧妙应用: #include<iost ...

  4. Configuration Management小结

    一.git branch和patch区别 patch,只是把diff部分创建一个分支.Detail: http://www.cnblogs.com/y041039/articles/2411600.h ...

  5. 使用Ext.Net时,配置文件的最简单写法

    使用Ext.Net时,配置文件的最简单写法 <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配 ...

  6. 添加hive默认配置hiverc

    可以在$HOME中加一个.hiverc文件,并在里面配置hive启动的一些参数. Fro example: http://hadooped.blogspot.com/2013/08/hive-hive ...

  7. HDOJ 1709 The Balance(母函数)

    The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. NGUI 实现 透明底图遮罩 && 人物像素变黑

    今天 UI 那边要求实现一个 透明底图遮罩 与 变黑 的效果. 刚开始考虑使用 shader 实现一个 网上搜了一下,发现了这个,但是底图需要不透明才行,不然他会把 底图的不遮罩部分的透明部分 进行颜 ...

  9. POJ 2464 Brownie Points II (树状数组,难题)

    题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个sta ...

  10. Java加密技术

    相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法  ...