您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
C#创建、安装一个Windows服务
 
作者:西北白杨树 来源:CSDN 发布于 2015-6-19
   次浏览      
 

关于WIndows服务的介绍,之前写过一篇:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739。可能这里对如何写一个服务不是很详细。现在纯用代码的形式介绍一下windows服务是如何开发和安装的。

开发环境:Win7 32位;工具:visualstudio2010。

因为win7自带的就有.net环境,算是偷一下懒吧。因为无论是手动安装或程序安装都要用到。一个目录(默认C盘为操作系统的情况):C:\Windows\Microsoft.NET\Framework,如果你的代码是.net2.0:C:\Windows\Microsoft.NET\Framework\v2.0.50727;4.0:C:\Windows\Microsoft.NET\Framework\v4.0.30319。

下面看一下代码:

一、创建windows服务

如图新建一个Windows服务

进入程序如图

空白服务如下:

public partial class Service1 : ServiceBase  
{
System.Threading.Timer recordTimer;


public Service1()
{
InitializeComponent();
}


protected override void OnStart(string[] args)
{
}


protected override void OnStop()
{
}
}

只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。

如图

创建一个类,用户写文件,

public class FileOpetation  
{
/// <summary>
/// 保存至本地文件
/// </summary>
/// <param name="ETMID"></param>
/// <param name="content"></param>
public static void SaveRecord(string content)
{
if (string.IsNullOrEmpty(content))
{
return;
}


FileStream fileStream = null;


StreamWriter streamWriter = null;


try
{
string path = Path.Combine(System.AppDomain.CurrentDomain. SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));


using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))
{
using (streamWriter = new StreamWriter(fileStream))
{
streamWriter.Write(content);


if (streamWriter != null)
{
streamWriter.Close();
}
}


if (fileStream != null)
{
fileStream.Close();
}
}
}
catch { }
}
}

那么在Service1中调用,

public partial class Service1 : ServiceBase  
{
System.Threading.Timer recordTimer;


public Service1()
{
InitializeComponent();
}


protected override void OnStart(string[] args)
{
IntialSaveRecord();
}


protected override void OnStop()
{
if (recordTimer != null)
{
recordTimer.Dispose();
}
}


private void IntialSaveRecord()
{
TimerCallback timerCallback = new TimerCallback(CallbackTask);


AutoResetEvent autoEvent = new AutoResetEvent(false);


recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10);
}


private void CallbackTask(Object stateInfo)
{
FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now));
}
}

这样服务算是写的差不多了,下面添加一个安装类,用于安装。

如图,在service1上右键-添加安装程序,

如图,添加一个安装程序,

如图,添加完成后,

设置相应的属性,给serviceInstaller1设置属性,主要是描述信息。如图,

给serviceProcessInstaller1设置,主要是account。一般选localsystem,如图,

这样服务已经写好了。那么如何添加到windows服务里面去呢。除了之前说过的用CMD,InstallUtil.exe和服务的exe文件进行手动添加。这些可以用代码来实现的。当然主要过程都是一样的。代码实现也是使用dos命令来完成的。

二、代码安装Windows服务

上面写好的服务,最终生成的是一个exe文件。如图,

安装程序安装时需要用到这个exe的路径,所以方便起见,将这个生成的exe文件拷贝至安装程序的运行目录下。
安装代码,

class Program  
{
static void Main(string[] args)
{
Application.EnableVisualStyles();


Application.SetCompatibleTextRenderingDefault(false);


string sysDisk = System.Environment.SystemDirectory.Substring(0,3);


string dotNetPath = sysDisk + @"WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe"; //因为当前用的是4.0的环境


string serviceEXEPath = Application.StartupPath+@"\MyFirstWindowsService.exe"; //把服务的exe程序拷贝到了当前运行目录下,所以用此路径


string serviceInstallCommand = string.Format(@"{0} {1}", dotNetPath, serviceEXEPath); //安装服务时使用的dos命令


string serviceUninstallCommand = string.Format(@"{0} -U {1}", dotNetPath, serviceEXEPath); //卸载服务时使用的dos命令


try
{
if (File.Exists(dotNetPath))
{
string[] cmd = new string[] { serviceUninstallCommand };


string ss = Cmd(cmd);


CloseProcess("cmd.exe");
}


}
catch
{
}


Thread.Sleep(1000);


try
{
if (File.Exists(dotNetPath))
{
string[] cmd = new string[] { serviceInstallCommand };


string ss = Cmd(cmd);


CloseProcess("cmd.exe");
}


}
catch
{


}


try
{
Thread.Sleep(3000);


ServiceController sc = new ServiceController("MyFirstWindowsService");


if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) ||


(sc.Status.Equals(ServiceControllerStatus.StopPending)))
{
sc.Start();
}
sc.Refresh();
}
catch
{
}
}


/// <summary>
/// 运行CMD命令
/// </summary>
/// <param name="cmd">命令</param>
/// <returns></returns>
public static string Cmd(string[] cmd)
{
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();
p.StandardInput.AutoFlush = true;
for (int i = 0; i < cmd.Length; i++)
{
p.StandardInput.WriteLine(cmd[i].ToString());
}
p.StandardInput.WriteLine("exit");
string strRst = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
return strRst;
}


/// <summary>
/// 关闭进程
/// </summary>
/// <param name="ProcName">进程名称</param>
/// <returns></returns>
public static bool CloseProcess(string ProcName)
{
bool result = false;
System.Collections.ArrayList procList = new System.Collections.ArrayList();
string tempName = "";
int begpos;
int endpos;
foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses())
{
tempName = thisProc.ToString();
begpos = tempName.IndexOf("(") + 1;
endpos = tempName.IndexOf(")");
tempName = tempName.Substring(begpos, endpos - begpos);
procList.Add(tempName);
if (tempName == ProcName)
{
if (!thisProc.CloseMainWindow())
thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程
result = true;
}
}
return result;
}
}

这段代码其实可以放在项目中的某个地方,或单独执行程序中,只好设置好dotNetPath和serviceEXEPath路径就可以了。

运行完后,如图,

再在安装目录下看记录的文件,

这样,一个windows服务安装成功了。

   
次浏览       
 
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
 
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
 
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新活动计划
Node+Vue3.0前端全栈开发 7-5 [特惠]
Spring Cloud微服务架构 7-5[特惠]
SysML和EA系统设计与建模 7-26[特惠]
Python、数据分析与机器学习 8-23[特惠]
嵌入式软件架构设计 8-22[线上]
Linux内核编程及设备驱动 7-25[北京]

使用decj简化Web前端开发
Web开发框架形成之旅
更有效率的使用Visual Studio
MVP+WCF+三层结构搭建框架
ASP.NET运行机制浅析【图解】
编写更好的C#代码
10个Visual Studio开发调试技巧
更多...   

.NET框架与分布式应用架构设计
.NET & WPF & WCF应用开发
UML&.Net架构设计
COM组件开发
.Net应用开发
InstallShield

日照港 .NET Framework & WCF应用开发
神华信息 .NET单元测试
北京 .Net应用软件系统架构
台达电子 .NET程序设计与开发
赛门铁克 C#与.NET架构设计
广东核电 .Net应用系统架构
更多...