美文网首页
给WPF程序添加以Windows服务的方式运行的功能

给WPF程序添加以Windows服务的方式运行的功能

作者: 达哥傻乐 | 来源:发表于2022-04-07 11:23 被阅读0次

    在做好一个WPF的程序后,有时候想让它的部分功能以服务的形式安装到Windows系统中,然后以Windows服务的方式运行,而图形界面仅作该服务的配置用途。在此记录一下开发的步骤以备忘。

    1. 新建一个WPF的App,其实WinForm类之类的大同小异,为了调试的方便,我一般先以普通的App的方式建议项目,然后把所有的配置功能等全做好,测试好,把功能部分全完成。
    2. 一切就绪好,开始来把这个WPF的App改造使之能支持Windows服务模式运行:
      2.1 在解决方案浏览器的项目标题上右击后依次选“添加Add”、“新项目New Item”:


      图1. 开始添加Windows服务相关内容

      2.2 如下图的步骤操作,第三步给添加的Windows服务取一个名字(这里以这个ServiceWatchdogSwitch为例):


      图2. 添加Windows服务
      2.3 在解决方案浏览器里双击上面一步添加的服务ServiceWatchdogSwitch.cs,在属性窗口配置好服务的名称(ServiceName属性),接下来在打开的设计视图空白处点右键后在弹出菜单中选“添加安装程序Add Installer”
      图3. 添加服务安装程序
      2.4 在解决方案浏览器里双击服务安装程序,然后在设计视图中分别选中两个安装器分别配置好其属性,包括服务的启动模式、描述、显示名称、运行账号等。服务安装程序是用于用其它工具比如InstallUtil等进行服务安装的时候用的。

      2.5 给项目添加新的入口点(entry point)。在项目里添加一个新的类,这里给类起名叫Program,打开类的源代码,用下面的代码替换原有的类:

       static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            static void Main()
            {
                string[] args = Environment.GetCommandLineArgs();
                var findW = from arg in args
                            where arg.ToLower() == "w" || arg.ToLower() == "/w" || arg.ToLower() == "-w"
                            select arg;
    
                if (args.Length == 2 && findW.Count() > 0)
                {
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[]
                    {
                    new ServiceWatchdogSwitch()
                    };
                    ServiceBase.Run(ServicesToRun);
                }
                else
                {
                    UIMode();
                }
            }
    
    
            private static void UIMode()
            {
    
                // create a thread  
                Thread newWindowThread = new Thread(new ThreadStart(() =>
                 {
                     var mw = new MainWindow()
                     {
                         WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen
                     };
    
                     mw.ShowDialog();
    
                     Thread.CurrentThread.Abort();
    
                 }));
    
                // set the apartment state  
                newWindowThread.SetApartmentState(ApartmentState.STA);
    
                // make the thread a background thread  
                newWindowThread.IsBackground = true;
    
                // start the thread  
                newWindowThread.Start();
    
                while (newWindowThread.ThreadState != ThreadState.Stopped) System.Threading.Thread.Sleep(50);
            }
    
        }
    

    上面程序中,Main()里决定了,如果程序是带w、/w或者-w参数启动的,那么让它以服务的方式运行,否则调用UIMode()进入图形界面非服务模式。
    2.6 在解决方案浏览器上点右键在弹出菜单中点“属性Properties”,在弹出的项目的属性里,将入口点改成Program类如下图:


    图4. 修改入口点

    至此,改装就完成了,只需要将服务妥妥地安装好就行了,注意启动命令要带参数w、/w或者-w。

    达叔傻乐(darwin.zuo@163.com)

    相关文章

      网友评论

          本文标题:给WPF程序添加以Windows服务的方式运行的功能

          本文链接:https://www.haomeiwen.com/subject/vxvjsrtx.html