有没有什么方法,创建此windows服务之后,不用手动启动,一运行此windows服务,它就自启动了?
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,本人想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位高手指点
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,本人想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位高手指点
解决方案
10
本人去看下Program.cs的Main函数吧
默认假如是服务的话通过ServiceBase.Run来运行
你可以本人加个参数,直接执行相应的方法
默认假如是服务的话通过ServiceBase.Run来运行
你可以本人加个参数,直接执行相应的方法
10
你可以把一个windows service工程(修改应用程序属性)重新设置为“控制台应用”,然后以你说得控制台方式执行。
控制台方式的 main 可以这样写(例如)
控制台方式的 main 可以这样写(例如)
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 }
10
Execute(); 实际上就是你的执行业务处理的主程序。你的服务中可能就是这样调用它的
partial class Service : ServiceBase { public Service() { InitializeComponent(); } protected override void OnStart(string[] args) { ThreadPool.QueueUserWorkItem(h=> Program.Execute(false)); //自定义参数表示能否是控制台调用 } }
所以,一个控制台程序,它可以用“命令行参数”来控制服务的安装、卸载。并且也可以以控制台方式测试执行。
10
调用执行一个*.bat文件好了,bat文件restart 你的电脑
10
你的所谓“用cmd命令行创建此服务”于这里的
abc.exe -i
命令的区别,你本人一看便知。
这里,abc.exe 把本人安装为服务器,然后立刻启动了服务器!
abc.exe -i
命令的区别,你本人一看便知。
这里,abc.exe 把本人安装为服务器,然后立刻启动了服务器!
10
呵呵,随时卸载和安装服务,是不用启动电脑的哇。
5
sc create [Name] binpath= "[path]" start= auto
每个=后面有一个空格
5
假如是客户端的exe 直接 用哪个 电脑自带的计划任务就行,然后设置一下
30
通常,在服务器上第一次安装服务,或服务程序改动很大,你需要先用控制台方式运行一下,观察一小会儿(这时候客户端各种程序照常对它测试)。确认它没有抛出 bug、没崩溃,再用 -i 方式安装和启动它。假如直接启动服务,假如它运行时有 bug,你不容易看到。所以其实服务应该这样设计,是最简洁实用的。
另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,假如不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的全部程序的版本。
另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,假如不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的全部程序的版本。