C#创建服务及使用程序自动安装服务
.NET创建一个即是可执行程序又是Windows服务的exe
不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载。
今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以让一个exe即能直接运行也行安装为windows服务
首先我们创建一个Windows应用程序,(我创建的是控制台程序,WinForm也一样)

接下来在项目中添加一个Windows服务类


然后双击“MainService.cs”,在上面点右键“打开代码”

这里面写服务的具体实现,以下是我写的示例代码

partial class MainService : ServiceBase
{
public MainService()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
System.IO.File.AppendAllText("D:\\log.txt", "服务已启动……" + DateTime.Now.ToString());
} protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
System.IO.File.AppendAllText("D:\\log.txt", "服务已停止……" + DateTime.Now.ToString());
}
}

然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码
如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService

static void Main(string[] args)
{
//如果传递了"s"参数就启动服务
if (args.Length > 0 && args[0] == "s")
{
//启动服务的代码,可以从其它地方拷贝
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MainService(),
};
ServiceBase.Run(ServicesToRun);
}
else
{}

然后,我们再实现应用程序的功能,就是上面的else语句块,应用程序的功能就是安装/卸载服务,可以用windows自带的sc命令来进行安装和卸载,具体代码如下:

Console.WriteLine("这是Windows应用程序");
Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
var rs = int.Parse(Console.ReadLine());
switch (rs)
{
case 1:
//取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
var path = Process.GetCurrentProcess().MainModule.FileName + " s";
Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
Console.WriteLine("安装成功");
Console.Read();
break;
case 2:
Process.Start("sc", "delete myserver");
Console.WriteLine("卸载成功");
Console.Read();
break;
case 3: break;
}

这样我们就实现了一个即是可执行程序又是Windows服务的应用程序
Main方法完整代码如下

static void Main(string[] args)
{
if (args.Length > 0 && args[0] == "s")
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MainService(),
};
ServiceBase.Run(ServicesToRun);
}
else
{
Console.WriteLine("这是Windows应用程序");
Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
var rs = int.Parse(Console.ReadLine());
switch (rs)
{
case 1:
//取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
var path = Process.GetCurrentProcess().MainModule.FileName + " s";
Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
Console.WriteLine("安装成功");
Console.Read();
break;
case 2:
Process.Start("sc", "delete myserver");
Console.WriteLine("卸载成功");
Console.Read();
break;
case 3: break;
}
}
}

至此,程序已基本写完,接下来我们测试一下
直接双击ServiceOrApp.exe

输入 1

提示安装成功,然后运行“services.msc"打开服务管理器

可以发现我们的服务已安装成功,然后右键启动服务

成功启动

然后去D盘看看log.txt

说明服务执行正常
我们再停止服务

成功停止后再看看D盘的log.txt文件

看到以上内容,说明服务启动和停止都没问题(忘了输出换行符 - -!)
然后我们再试一下卸载服务,还是双击ServiceOrApp.exe,选择2

提示卸载成功,然后再运行“services.msc"打开服务管理器

可以看到已经没有”我的服务“了,已成功卸载
这里安装和卸载主要运用了windows的sc命令,然后使用启动参数来判断是服务还是程序以执行不同的代码
C#创建服务及使用程序自动安装服务的更多相关文章
- [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...
- C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以 ...
- zabbix通过curl命令判断web服务是否正常并自动重启服务
zabbix通过curl命令判断web服务是否正常并自动重启服务 主要思路: 通过curl命令获取服务器响应码,如果正常返回200,不正常返回000 具体命令: curl -I -s -w " ...
- paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决
paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决 系统win7 NewPhDDNS_1.0.0.30166.exe 作者Attilax 艾龙, EMAIL:1466519819@ ...
- Linux 实现自动安装服务组件以及优化内核参数 (转)
安装好Linux裸机后(安装请参考:http://blog.itpub.net/26230597/viewspace-1380155/),还需要在其上安装一些基础组件,一般是手动一个个安装,比较繁复也 ...
- C#程序自动安装数字证书
using System.Security.Cryptography.X509Certificates; MessageBox.Show("开始"); //添加个人证书 X509C ...
- tomcat安装服务和内存参数设置
第一:安装服务 在dos窗口进入到tomcat的bin目录下,通过如下命令即可将tomcat安装成服务 service.bat install Tomcat2 其中Tomcat2是服务的名称 如果启动 ...
- nssm常用命令(在Windows系统下安装服务的工具)
nssm install servername //创建servername服务 nssm start servername //启动服务 nssm stop servername //暂停服务 ns ...
- windows service自动重启服务
服务一般都能正常的运行,但有时候也会有一些假死现象,比如公司有一考勤服务就因为依赖于硬件厂家的api, 但厂家api运行一段时间后会默名的假死,引起整个服务假死,因为这一假死现象具有不确定性,所以不太 ...
随机推荐
- Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
Net 项目构建基于Jenkins + Github + Mono 的持续集成环境 阅读目录 1 安装 2 配置 3 测试 在Redhat enterprise 6.5 的服务器上,为在gutub 上 ...
- AVR文章7课时:动态数字化控制
下面是动态数码管的电路图. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva290ZWlfODhfbHVsdWNfNjY=/font/5a6L5L2T/fo ...
- sql server 2008如何导入mdf,ldf文件
sql server 2008怎样导入mdf,ldf文件 网上找了非常多解决sql server导入其它电脑拷过来的mdf文件,多数是不全.遇到的解决方法不一样等问题,下边是找到的解决这个问题的最 ...
- hosts目录位置
C:\WINDOWS\system32\drivers\etc 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- CentOS 忘记 root password处理
在倒计时启动时间,按任意键进入,例如下面的页面 输入 e. 进入这个页面.上下移动至高亮条到中间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ29yZV ...
- Android和C#实时视频传输Demo
说起去年的Demo.以今天的免费整齐优势. 原理很easy,虽然没有写android申请书.但,好了~ 高级语言是相通的.傲慢约.就这么简单研究了一下api后,找到相机对象有一个预览回调方法. 意识到 ...
- 亚马逊记AWS(Amazon Web Services)自由EC2应用
很长时间,我听到AWS能够应用,但是需要结合信用卡,最近申请了. 说是免费的,我还是扣6.28,后来我上网查了.认为是通过进行验证.像服务期满将返回. 关键是不要让我进入全抵扣信用卡支付passwor ...
- 82. NotesclientPrint相同的信息,以状态栏的问题
这可能是一个小问题.但其他人也应该得到满足.在Notesclient使用LotusScript的Print当该语句是输出到状态栏,假设实际参数传递多次调用相同,状态栏将显示只有一次的信息. 例如: P ...
- redis和redis php扩展安装(转)
redis是一个内存数据库,比memcache支持更丰富的value类型,新浪微博就使用redis来做缓存. redis的源码安装 wget http://download.redis.io/redi ...
- 工厂模式IDAL具体解释
IDAL 一. IDAL主要功能: 1.这全然是"工厂模式"的一部分实现而已 2.这是一组接口类,当中包含了每一个要公开的数据訪问方法.为每一个数据库产品单独编写的DAL(数据訪问 ...