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

在做好一个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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容