新建了一个windows服务,关机再开机能够自启动,但是用cmd命令行创建此服务需要手动启动

你说什么我听不见啊 2016-07-11 11:55:28
有没有什么方法,创建此windows服务之后,不用手动启动,一运行此windows服务,它就自启动了?
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,我想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位大神指点
...全文
439 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
通常,在服务器上第一次安装服务,或者服务程序改动很大,你需要先用控制台方式运行一下,观察一小会儿(这时候客户端各种程序照常对它测试)。确认它没有抛出 bug、没崩溃,再用 -i 方式安装和启动它。如果直接启动服务,如果它运行时有 bug,你不容易看到。所以其实服务应该这样设计,是最简洁实用的。 另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,如果不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的所有程序的版本。
事实胜于雄辩 2016-07-14
  • 打赏
  • 举报
回复
如果是客户端的exe 直接 用哪个 电脑自带的计划任务就行,然后设置一下
  • 打赏
  • 举报
回复
引用 7 楼 crystal_lz 的回复:

sc create [Name] binpath= "[path]" start= auto
每个=后面有一个空格
这个我加了
crystal_lz 2016-07-11
  • 打赏
  • 举报
回复

sc create [Name] binpath= "[path]" start= auto
每个=后面有一个空格
  • 打赏
  • 举报
回复
引用 4 楼 shoppo0505 的回复:
调用执行一个*.bat文件好了,bat文件restart 你的电脑
呵呵,随时卸载和安装服务,是不用启动电脑的哇。
  • 打赏
  • 举报
回复
你的所谓“用cmd命令行创建此服务”于这里的 abc.exe -i 命令的区别,你自己一看便知。 这里,abc.exe 把自己安装为服务器,然后立刻启动了服务器!
shoppo0505 2016-07-11
  • 打赏
  • 举报
回复
调用执行一个*.bat文件好了,bat文件restart 你的电脑
  • 打赏
  • 举报
回复
Execute(); 实际上就是你的执行业务处理的主程序。你的服务中可能就是这样调用它的
    partial class Service : ServiceBase
    {
        public Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
                      ThreadPool.QueueUserWorkItem(h=>  Program.Execute(false));    //自定义参数表示是否是控制台调用
        }
    }
所以,一个控制台程序,它可以用“命令行参数”来控制服务的安装、卸载。并且也可以以控制台方式测试执行。
  • 打赏
  • 举报
回复
你可以把一个windows service工程(修改应用程序属性)重新设置为“控制台应用”,然后以你说得控制台方式执行。 控制台方式的 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
        }
Poopaye 2016-07-11
  • 打赏
  • 举报
回复
自己去看下Program.cs的Main函数吧 默认如果是服务的话通过ServiceBase.Run来运行 你可以自己加个参数,直接执行相应的方法

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧