windows下无法像linux那样直接运行nohup等命令运行后台程序,只能调用相应api做成服务。服务可以在没有任何用户登录计算机的情况下运行。C# 建立windows 服务比较方便,直接派生 System.ServiceProcess.ServiceBase,但是只支持windows XP。

  

/// <summary>
/// 1.建立windows服务类,派生于ServoceBase
/// <summary>
partial class MainService : ServiceBase
{
/**
* 服务启动时调用,此时代码要立即返回。否则服务启动时一直等待,
* 造成服务启动失败。最好启动线程或定时器。
*
*/
protected override void OnStart(string[] args)
{
File.WriteAllText(@"d:\log.log","Start service");
}

// 服务停止时调用
protected override void OnStop()
{
File.WriteAllText(@"d:\log.log","Stop service");
}
}


/// <summary>
/// 2.启动服务
/// </summary>
static void Main(string[] args)
{
// 服务列表
ServiceBase[] ServiceToRun = new ServiceBase[]
{
new MainService(),
};

ServiceBase.Run(ServiceToRun); // 可以同时启动多个服务
}


/// <summary>
/// 3.安装服务,设置RunInstallerAttribute
/// </summary>
[RunInstallerAttribute(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent();
}

private void serviceProcessInstaller1_AfterInstall(object sender, InstallEventArgs e)
{

}
}

 


 

上述方式,需要运行 InstallUtil.exe /i 程序.exe 安装服务

 卸载服务: InstallUtil.exe /u 程序.exe,服务管理不太方便,可通过直接调用sc命令实现自动管理服务。

 

/// 命令行自动安装卸载服务
static void Main(string[] args)
{
// 自动安装卸载服务
if (args.Length > 0 && args[0] == "d")
{
ServiceBase[] ServiceToRun = new ServiceBase[]
{
new MainService(),
};

ServiceBase.Run(ServiceToRun);
}
else
{
Console.WriteLine("Usage:[1]install [2]uninstall [3]exit");
var rs = int.Parse(Console.ReadLine());

switch(rs)
{
case 1:
var path = Process.GetCurrentProcess().MainModule.FileName + " d";
Process.Start("sc", "create whitesynserver binpath= \"" + path + "\" displayName= 白名单同步服务 start= auto");
Console.WriteLine("安装成功");
Console.Read();
break;
case 2:
Process.Start("sc", "delete whitesynserver");
Console.WriteLine("卸载成功");
Console.Read();
break;
case 3:
break;
default:
break;
}
}
}