看了好多相关帖子,大部分都是用Instsrv.exe和Srvany.exe,要下载安装麻烦的要死.
今天分享一种不一样的方式.
一. 这里贴一下我们的Program类
1.Program.cs
using Ivony.Html;
using Ivony.Html.Parser;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.ServiceProcess;
using System.Diagnostics;
using System.Threading;
namespace 爬虫Framework
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始");
try
{
// PaChong();
Program.Start(args);
}
catch (Exception e)
{
//Main();
Console.WriteLine("错误:{0}", e.ToString());
Console.ReadKey();
}
}
/// <summary>
/// 线程
/// </summary>
public static void ThreadStart()
{
Thread thread = new Thread(new ThreadStart(PaChong));
thread.Start();
}
public static void PaChong()
{
//主体程序
}
private static void Start(string[] args)
{
try
{
if (args != null && args.Length > 0)
{
string s = args[0].Trim();
if (string.Compare(s, @"/i", true) == 0)
{
SetupWinService(true);
}
else if (string.Compare(s, @"/u", true) == 0)
{
SetupWinService(false);
}
else if (string.Compare(s, @"/r", true) == 0)
{
}
else
{
Console.WriteLine("提示,参数列表:");
Console.WriteLine("\t\t /u \t\t 卸载本服务");
Console.WriteLine("\t\t /i \t\t 安装本服务");
Console.WriteLine("\t\t /r \t\t 以控制台运行本程序");
}
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new pachong()
};
ServiceBase.Run(ServicesToRun);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// 安装本服务
/// </summary>
static void SetupWinService(bool isInstall)
{
try
{
string util = string.Empty;
if (Environment.Is64BitOperatingSystem)
{
util = @"Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe";
}
else
{
util = @"Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe";
}
string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
string tools = System.IO.Path.Combine(winDir, util);
string myPath = "\"" + System.Windows.Forms.Application.ExecutablePath + "\"";
if (isInstall)
{
Exec(tools, myPath);
}
else
{
Exec(tools, "/u " + myPath);
}
}
catch (Exception ex)
{
}
}
static void Exec(string exe, string param)
{
try
{
Process p = new Process();
p.StartInfo = new ProcessStartInfo(exe, param);
p.Start();
}
catch (Exception ex)
{
}
}
}
}
说明:
1. 这里用到了多线程,是因为有些程序业务逻辑可能比较复杂和有多个循环的,在启动服务时会导致启动超时.
二. 添加Windows服务.
1.添加服务
2.修改服务
右击该服务=> 选择 查看代码
添加 Program.ThreadStart(); 如下
partial class pachong : ServiceBase
{
public pachong()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
Program.ThreadStart();
}
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
}
}
3.设置属性
双击该服务=>右击 => 添加安装程序
选择serviceProcessInstaller1 设置Account 为 LocalSystem
代码和设置部分已完成,生成项目.
三.安装服务
1.以管理员身份运行 cmd
2.进入生成目录:E:\>cd E:\Test\爬虫\爬虫Framework\bin\Debug
3.执行安装命令: E:\Test\爬虫\爬虫Framework\bin\Debug>爬虫Framework.exe /i
四.启动服务
此时可以在服务中找到我们已经安装的服务,服务的名称就是我们添加的Windows服务的名称.