Windows服务的安装方法总结
C#创建Windows服务与安装-图解
百度经验:jingyan.baidu.com
一、第一种安装方法
使用.net framework自带的安装服务的程序进行安装
创建项目1
创建windows服务项目
右键点击Service1.cs,查看代码, 用于编写操作逻辑代码
代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回
安装服务配置
打开Service1.cs视图界面
在视图内右键-->添加安装程序
项目中添加了ProjectInstaller.cs文件,该文件中视图自动会添加俩个组件
serviceProcessInstaller1
serviceInstaller1
选中serviceProcessInstaller1组件,查看属性,设置account为LocalSystem
选中serviceInstaller1组件,查看属性
设置ServiceName的值, 该值表示在系统服务中的名称
设置StartType, 如果为Manual则手动启动,默认停止,如果为Automatic为自动启动
设置Description,添加服务描述
安装服务1
点击 开始,运行中输入cmd,获取命令提示符
win7需要以管理员的身份启动,否则无法安装
输入 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319回车
切换当前目录,此处需要注意的是,在C:\Windows\Microsoft.NET\Framework目录下有很多类似版本,具体去哪个目录要看项目的运行环境,例如果是.net framework2.0则需要输入cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
输入InstallUtil.exe E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe回车
说明:E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe表示项目生成的windowsservice主输出文件位置
打开服务,就可以看到已经安装的服务了
卸载服务:1
卸载很简单,打开cmd, 直接输入 sc delete WinServiceTest便可
第二中安装方法
使用windows批处理方法进行安装
1.服务项目完成之后,在服务解决方法中建立一个windows批处理文件命名为:InstallService.bat
文件中的内容书写如下:
@echooff
echo--------------------------------------------------------------
echo- 开始安装服务 -
echo--------------------------------------------------------------
pause
set appdir=%cd%\SimulateHexiaoWindowsService.exe
setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727
cd/d %Addr%
installutil.exe %appdir%
IFERRORLEVEL 255 GOTO Label255
IFERRORLEVEL 254 GOTO Label254
IFERRORLEVEL 1 GOTO Label1
GOTOLabel0
:Label255
echocommands to be executed at errorlevel 255
GOTOEnd
:Label1
echocommands to be executed at errorlevel 1
GOTOEnd
:Label0
echo--------------------------------------------------------------
echo- 成功安装服务
echo--------------------------------------------------------------
pause
:End
1. 新建一个卸载服务的windows批处理文件 命名为:
UnInstallService.bat
@echooff
echo--------------------------------------------------------------
echo- 开始卸载服务
echo--------------------------------------------------------------
pause
setappdir=%cd%\SimulateHexiaoWindowsService.exe
setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727
cd/d %Addr%
installutil.exe /u %appdir%
IFERRORLEVEL 255 GOTO Label255
IFERRORLEVEL 254 GOTO Label254
IFERRORLEVEL 1 GOTO Label1
GOTOLabel0
:Label255
echocommands to be executed at errorlevel 255
GOTOEnd
:Label1
echocommands to be executed at errorlevel 1
GOTOEnd
:Label0
echo--------------------------------------------------------------
echo- 成功卸载服务
echo--------------------------------------------------------------
pause
:End
注意:此处需要注意的同样如一方法中所说,如果创建的服务项目框架是.Net framework 2.0的则要把批处理文件中的设置改为setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727如果是.Netframework 4.0的话,这要修改为set Addr=C:\Windows\Microsoft.NET\Framework\v4.0.30319,本质上该方法和第一种方法是一样的。
三、使用vs的安装项目的安装方法来安装
1.创建window服务项目
首先我们建一个window服务项目 :解决方案(右击)——>增加 ——>新建项目——>项目类型选择Windows——>模板选择Windows服务
2.编写Window服务程序
创建后会生成两个文件 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)
{
Start ();
}
/// <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 Starto()
{
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,表示本地系统帐号
3.安装程序
安装程序制作:解决方案(右击)——>增加 ——>新建项目 ——>项目类型选择安装和部署——> 模板选择安装项目 如图 :
创建后,安装项目(右击)——>视图 ——>文件系统如图:
由于我们是安装服务,就不需要用户桌面和程序菜单了,直接应用程序文件夹(右击)——>增加 ——>项目输出 入图 :
上面有两点需要注意 ,一 项目选择中选择要安装的服务, 二 项目选择下面要选择主输出,选择好后确定,这一步增加了安装程序的文件夹,下一步就是给这个安装程序增加操作,这里我们增加两个基本操作,一个是安装,一个是卸载。安装项目(右击) ——>视图 ——> 自定义操作 如图
上面可以看到有安装,提交,回滚,卸载等操作,我们先增加安装操作,安装(右击)——>增加自定义操作,会弹出一个对话 如图:
选择应用程序文件夹,并选中之前增加的主输出项,确定,这样这个安装程序就增加了安装的操作,同样按照这样的方式增加卸载操作,卸载与安装唯一不同的是需要设置一个命令参数,不可少,如图:
这里 Arguments里输入 /u 表示卸载命令相当于InstallUtil.exe /u 服务路径 ,到这里 ,我们的安装程序就已经制作好了,生成安装程序项目,将会生成 setup.exe和 setup.msi安装文件,拷贝到客户端,点击setup.exe就像安装其他windows程序一样安装我们的服务