右键创建一个服务项目
把默认里面有个Server1.cs改名,改成自己想要的名字
改名后,双击,右键新增安装程序
然后点击安装程序,修改第二个控件的属性
这里主要改启动模式,自动启动,开机启动,手动,和控件名字
然后再改左边那个,这里主要改名字和服务运行的账号
运行账号默认是USER,可以改成本地账号或者其他,这个USER后面重点说下
然后新建服务安装的bat文件:
这里有个注意点:如果程序是framework4.0 和以上的,需要用v4.0xxx,4.0以下的用v2.0xxx
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe E:\邮件接口\EmailData\EmailServer.exe
Net Start EmailServer
sc config EmailServer start= auto
pause
卸载服务的bat文件
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u E:\邮件接口\EmailData\EmailServer.exe
pause
生成后,点bat就可以安装服务了
这里重点说下,USER模式下的安装遇到的坑,
USER模式下,点击安装会弹出让你输入管理员账号密码,其他模式则不需要,但是输入账号密码的时候需要主意userName= .\username ,否则就算密码账号正确,也提示错误
最后一点关于服务内部的逻辑:
内置3个事件:初始化、服务启动、服务关闭,这就够了,核心逻辑就是,初始化的时候做一个定时器,服务启动的时候启动定时器,结束的时候关闭定时器。
这时候我部署的服务器不知道遇到了什么问题,定时器不执行,然后我就用多线程+while死循环做了一个类似定时器的东西,代码如下:
using EmailServer.Models;
using OpenPop.Mime;
using OpenPop.Pop3;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace EmailServer
{
public partial class EmailServer : ServiceBase
{
bool isRun = false;
Thread thread = null;
public EmailServer()
{
InitializeComponent();
//初始化一个线程
thread = new Thread(new ThreadStart(Exec));
}
protected override void OnStart(string[] args)
{
isRun = true;
//服务启动,线程启动
thread.Start();
}
protected override void OnStop()
{
isRun = false;
//服务关闭,线程注销
thread.Abort();
}
private void Exec()
{
while (isRun)
{
//线程内部的逻辑,执行一次,停多少秒,继续执行,实现了定时器的功能
Thread.Sleep(1000 * int.Parse(ConfigurationManager.AppSettings["Timer"]));
}
}
}
}