一、项目背景
在平常的开发过程中,时常会遇到windows控制台应用程序在桌面运行或者隐藏运行后,被其他人员关掉。导致应用程序无法继续进行的尴尬,最终导致数据丢失。那么,将windows控制台程序配置为可在windows服务中运行,就显得科学很多。这样不会被无关因素导致关闭。windows服务我们也可以配置,实时检查,如果关闭就自动重启。
二、windows控制台程序配置为windows服务运行
1、在控制台应用程序中增加Windows服务。右键项目-》新建项-》Windows服务,点击添加即可在项目中新增Service1.cs的文件。
2、配置Windows服务代码。
双击添加的Service1.cs文件,这里我将Service1.cs重命名为了MQTTDataSync.cs,下同。
在空白处右键-》查看代码,打开代码查看器,windows服务自动生成了OnStart和OnStop两个方法,分别为服务开启和结束时运行。我们需要将我们的业务代码方法放在两个方法中调用即可。另外我们可以在初始化组件的下方,增加我们服务的命名,代码如下:
3、添加windows安装程序。
双击打开服务【设计】,在空白处右键-》添加安装程序,系统会自动生成安装程序,我们只需要对安装程序进行属性配置:
首先鼠标左键点击serviceProcessInstaller1,查看右下角的属性,并进行编辑,此处需要将Account更改为LocalSystem。另外用户可以自定义Name:
然后鼠标左键点击serviceInstaller1,查看右下角的属性,并进行编辑,用户可以编辑服务的名称ServiceName、显示名称DisplayName、描述Description等属性。
4、安装器配置完成之后,我们就完成了windows服务的配置。但是我们都知道控制台应用程序是从Program.cs开始运行的。如何让主程序执行程序变成windows服务执行程序呢。我们需要对Program.cs进行如下更改:
class Program
{
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MQTTDataSync() //此处是我们的windows服务类名称
};
ServiceBase.Run(ServicesToRun);
}
}
我们前面已经在windows服务的OnStart方法中增加了我们的业务方法,所以在windows服务运行时,可以直接进入我们的业务逻辑。
5、发布安装。
我们将整个项目编译为Release之后,在bin目录中找到Release文件夹,就可以对windows服务进行安装了。为了避免命令行的麻烦。我们添加两个bat文件在Release文件夹下,setup.bat和unsetup.bat。
setup.bat包含以下内容:
installutil MQTT.exe//这里的exe名称为项目生成的exe名称
unsetup.bat包含以下内容:
installutil MQTT.exe /u//这里的exe名称为项目生成的exe名称
最后我们将整个Release文件夹复制到项目主机上,并双击文件夹中的setup.bat安装服务,我们的服务就会出现在服务列表中。这个时候我们需要对服务点击开始运行,才会运行服务。