第一步:新建控制台项目

 第二步:添加服务

第三步:右键新建完成的服务项

点击

在start 和stop事件中分别写上 

 第四步 编写代码

双击打开

 using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess; namespace SocketService
{
class Program
{
#region 可以修改的参数
//指定服务名称
private static string ServiceName = "SocketService";
//更换服务显示名称
private static string DisplayServiceName = "SocketService";
//更换服务拓展名
private static string Extension = ".exe";
//更改此项即可更换Service
private static ServiceBase ServiceToRun = new YSocketService();
#endregion
static void Main(string[] args)
{
if (args.Length > && args[] == "s")
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
ServiceToRun,
};
ServiceBase.Run(ServicesToRun);
}
else
{
Console.WriteLine("通用Service半自动化服务操作启动......");
bool isExit = false;
while (!isExit)
{
Console.WriteLine("请选择,[1]安装服务 [2]启动服务 [3]停止服务 [4]卸载服务 [5]退出");
bool IsServiceInstalled = ISWindowsServiceInstalled(ServiceName);
var rs = Convert.ToInt32(Console.ReadLine());
switch (rs)
{
case :
//取当前可执行文件路径
var path = Path.GetFullPath(ServiceName);
Process.Start("sc", "create " + ServiceName + " binpath= \"" + path + Extension + " s" + "\" displayName= " + DisplayServiceName + " start= auto");
Console.WriteLine("安装成功");
break;
case :
if (IsServiceInstalled == false)
{
Console.WriteLine("服务未安装......");
break;
}
using (ServiceController control = new ServiceController(ServiceName))
{
if (control.Status == ServiceControllerStatus.Stopped)
{
Console.WriteLine("服务启动......");
try
{
control.Start();
Console.WriteLine("服务已经启动......");
}
catch (Exception)
{
Console.WriteLine("无法启动服务!");
}
}
}
break;
case :
if (IsServiceInstalled == false)
{
Console.WriteLine("服务未安装......");
break;
}
using (ServiceController control = new ServiceController(ServiceName))
{
if (control.Status == ServiceControllerStatus.Running)
{
Console.WriteLine("服务停止......");
try
{
control.Stop();
Console.WriteLine("服务已经停止......");
}
catch (Exception)
{
Console.WriteLine("无法停止服务!");
}
}
else if ((control.Status == ServiceControllerStatus.Stopped)
|| (control.Status == ServiceControllerStatus.StopPending))
{
Console.WriteLine("当前服务未启动......");
}
}
break;
case :
if (IsServiceInstalled == false)
{
Console.WriteLine("服务未安装......");
break;
}
Process.Start("sc", "delete " + ServiceName);
Console.WriteLine("卸载成功");
break;
case : isExit = true; break;
default:
Console.WriteLine("输入错误!");
isExit = true;
break;
}
}
}
}
/// <summary>
/// 判断服务是否已经安装
/// </summary>
/// <param name="serviceName"></param>
/// <returns></returns>
private static bool ISWindowsServiceInstalled(string serviceName)
{
try
{
return ServiceController.GetServices().Any(c => c.ServiceName == serviceName);
}
catch
{ return false; }
}
}
}

第五步 配置log4net文件

新建配置文件

加入代码

 <log4net>
<logger name="LogHelper">
<level value="ALL" />
<appender-ref ref="Appender" />
</logger>
<logger name="LogHelperNormal">
<level value="ALL" />
<appender-ref ref="NormalAppender" />
</logger>
<appender name="Appender" type="log4net.Appender.RollingFileAppender">
<!--日志文件名开头-->
<param name="File" value="Log\\" />
<!--是否追加到文件,默认为true,通常无需设置-->
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="" />
<param name="MaxFileSize" value="" />
<param name="StaticLogFileName" value="false" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<param name="DatePattern" value="yyyyMMdd&quot;_Exception.htm&quot;" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
</layout>
</appender>
<appender name="NormalAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="" />
<param name="MaxSizeRollBackups" value="" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd&quot;_Normal.htm&quot;" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n日 志 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
</layout>
</appender>
</log4net>

完成.

最终文件形式如图

其中示例服务的loghelp是使用log4net自己封装了一个类库 使用时候需要把log4net.config文件选择复制到输出目录 不然不会打印日志

示例代码点击下方下载:(含loghelper)

网盘地址 链接: http://pan.baidu.com/s/1boWeHiv 密码: kjp5

c#用控制台程序安装启动停止卸载服务的更多相关文章

  1. delphi 启动停止windows服务 转

    http://blog.csdn.net/haiou327/article/details/6106233 不用cmd用delphi如何实现启动停止windows服务建议参考一下Delphi的Sckt ...

  2. Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务

    RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...

  3. bat启动/停止oracle服务

    原文:bat启动/停止oracle服务 自己的电脑比较慢,尤其装了oracle10g后,服务开启和关闭用bat文件操作省事点 开启服务 @echo offnet start OracleService ...

  4. 在CentOS 7中启动/停止/重启服务

    RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...

  5. Linux 下的 Redis 安装 && 启动 && 关闭 && 卸载

    转自https://blog.csdn.net/zgf19930504/article/details/51850594 Redis 在Linux 和 在Windows 下的安装是有很大的不同的,和通 ...

  6. c# windows server安装启动与卸载

    使用installutil.exe安装卸载服务时,由于需要指向服务的全路径,由于生成目录往往不是服务发布的最终目录,很不便利,下面介绍两种方式方便操作: 方式一: 项目中加入install.bat与u ...

  7. Windows下使用service.bat安装tomcat服务, 启动停止tomcat服务

    在项目开发过程中,以前只是在Eclipse中配置.启动.停止tomcat服务器 如果只想在机器中使用tomcat服务器,而不想安装MyEclipse,可以使用service.bat 将tomcat安装 ...

  8. 控制台程序实现利用CRM组织服务和SqlConnection对数据库中数据的增删改查操作

    一.首先新建一个控制台程序.命名为TestCol. 二.打开App.config在里面加入,数据库和CRM连接字符串 <connectionStrings> <add name=&q ...

  9. Delphi启动/停止Windows服务,启动类型修改为"自动"

    unit U_StartServices; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

随机推荐

  1. uva 10716 Evil Straw Warts Live(贪心回文串)

    这道题目我用了一上午才做出来,还是看的别人的思路,尽管没有看代码做的有点慢.代码能力还是得加强啊.思维 得缜密.不能想当然,要有根据,写上的代码要有精确度.省的以后还得慢慢调试 思路:贪心.每次都查看 ...

  2. 【oracle11g,18】存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表

    一. 暂时表 暂时表放在暂时表空间,不生成redo,仅仅有undo. 在暂时表中能够创建索引.视图及触发器,还能够使用"Export and Import(导出和导入)"或&quo ...

  3. jsoncpp的生成和使用

    从github下载jsoncpp-master 在执行\jsoncpp-master\makefiles\msvc2010文件夹下jsoncpp.sln 会有3个项目 执行lib_json项目生成li ...

  4. POJ 3683 Priest John&#39;s Busiest Day (2-SAT+输出可行解)

    题目地址:POJ 3683 第一次做须要输出可行解的题目. . .大体思路是先用强连通来推断是否有可行解,然后用逆序建图.用拓扑排序来进行染色.然后输出可行解. 详细思路见传送门 由于推断的时候少写了 ...

  5. Java与设计模式-适配器模式

    适配器模式是开发中常常会用到的模式,Android开发中常常常使用到的各种adapter就属于适配器模式,连接各种数据库时也要用到适配器模式. 适配器模式在生活中的实例也随处可见,你托人在日本买了个电 ...

  6. Linux Framebuffer驱动剖析之中的一个—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...

  7. 初探C++运算符重载学习笔记&lt;2&gt; 重载为友元函数

    初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...

  8. GPS时间

    GPS信息里面包含一个时间戳. phonegap(即cordova)的地理位置API Geolocation 提供了对设备GPS传感器的访问,返回的数据中,除了坐标,还有一个时间戳timestamp. ...

  9. leecode 题解 || Merge k Sorted Lists 问题

    problem: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its comp ...

  10. P2453 [SDOI2006]最短距离 dp

    自己想出来了!这个dp比较简单,而且转移也很简单,很自然,直接上代码就行了. 题干: 一种EDIT字母编辑器,它的功能是可以通过不同的变换操作可以把一个源串X [l..m]变换为新的目标串y[1..n ...