111,129
社区成员
发帖
与我相关
我的任务
分享
sc create [Name] binpath= "[path]" start= auto
每个=后面有一个空格 partial class Service : ServiceBase
{
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(h=> Program.Execute(false)); //自定义参数表示是否是控制台调用
}
}
所以,一个控制台程序,它可以用“命令行参数”来控制服务的安装、卸载。并且也可以以控制台方式测试执行。 static void Main(string[] args)
{
if (args.Length == 0)
{
#if !DEBUG
ServiceBase.Run(new Service());
#else
ShowHelp();
#endif
return;
}
if (args.Contains("-i"))
{
Uninstall(true);
端口.ForEach(p => 打开防火墙(p));
Install();
return;
}
if (args.Contains("-u"))
{
Uninstall();
return;
}
if (args.Contains("-t"))
{
Uninstall(true);
Execute(true);
Console.WriteLine("系统进入Pending状态。请按 Ctrl+Break 退出.....");
var eh = new ManualResetEvent(false);
Console.CancelKeyPress += (s, e) =>
{
eh.Set();
};
eh.WaitOne();
return;
}
ShowHelp();
}
private static void ShowHelp()
{
Console.WriteLine("命令参数格式:");
Console.WriteLine("\t-i:安装windows服务。");
Console.WriteLine("\t-u:卸载windows服务。");
Console.WriteLine("\t-t:以控制台方式执行服务。");
}
private static void 打开防火墙(int port)
{
var inf = new ProcessStartInfo
{
UseShellExecute = true,
FileName = "netsh",
Arguments = " firewall set portopening TCP " + port,
WindowStyle = ProcessWindowStyle.Hidden
};
var p = Process.Start(inf);
p.WaitForExit();
}
private static void Uninstall(bool 独立窗口 = false)
{
Console.WriteLine("停止 " + SvrName);
var info = new ProcessStartInfo("sc", "stop " + SvrName)
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = 独立窗口
};
var pro = Process.Start(info);
pro.WaitForExit();
Console.WriteLine("卸载 " + SvrName);
info.Arguments = "delete " + SvrName;
pro = Process.Start(info);
pro.WaitForExit();
}
private static void Install()
{
#if DEBUG
Console.WriteLine("以 DEBUG 模式编译的程序不应安装为 windows 服务。请重新编译程序。");
#else
Console.WriteLine("创建 " + SvrName);
//注意这些选项以等号结束,然后要有一个空格,后边才能跟选项值。一定不能缺少空格。
var info = new ProcessStartInfo("sc", string.Format("create {0} binpath= \"{1}\" displayname= \"{2}\" start= auto type= own",
SvrName, Process.GetCurrentProcess().MainModule.FileName, SvrDisplay))
{
WindowStyle = ProcessWindowStyle.Minimized,
UseShellExecute = false
};
var pro = Process.Start(info);
pro.WaitForExit();
Console.WriteLine("启动 " + SvrName);
info.Arguments = "start " + SvrName;
pro = Process.Start(info);
pro.WaitForExit();
#endif
}