C# 开发windows服务的一些心得

最近在做一个windows服务的项目,发现并解决了一些问题,拿出来和大家分享一下,以下windows服务简称“服务”

1.服务如何在某种情况下弹出一个窗体?

第一种解决办法,用安装程序的代码修改注册表来完成:

1.右击服务的视图设计界面的空白处,添加安装程序

2.右击默认的serviceProcessInstaller1-->属性-->Account属性设置为LocalSystem

3.右击安装程序空白处-->查看代码,添加以下代码

public override void Install(IDictionary stateServer)
        {
            Microsoft.Win32.RegistryKey system, currentControlSet,services,    service, config;

            try
            {

                base.Install(stateServer);
                //打开注册表值
                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
                currentControlSet = system.OpenSubKey("CurrentControlSet");
                services = currentControlSet.OpenSubKey("Services");
                service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
                //设置服务的描述
                service.SetValue("Description", "这是一个服务");
                //允许服务与桌面交互
                int value = (int)service.GetValue("Type");
                service.SetValue("Type", value | 256);
                config = service.CreateSubKey("Parameters");
            }
            catch (Exception e)
            {
                Console.WriteLine("An exception was thrown during service installation:/n" + e.ToString());
            }
        }

        public override void Uninstall(IDictionary stateServer)
        {
            Microsoft.Win32.RegistryKey system,
             currentControlSet,
             services,
             service;

            try
            {
                //Drill down to the service key and open it with write permission
                system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
                currentControlSet = system.OpenSubKey("CurrentControlSet");
                services = currentControlSet.OpenSubKey("Services");
                service = services.OpenSubKey(this.serviceInstaller1.ServiceName, true);
                //Delete any keys you created during installation (or that your service created)
                service.DeleteSubKeyTree("Parameters");
                //...
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception encountered while uninstalling service:/n" + e.ToString());
            }
            finally
            {
                //Let the project installer do its job
                base.Uninstall(stateServer);
            }
        }

这个方法很多,也可以在网上搜到

第二种解决办法,用bat批处理文件修改注册表完成(如果已经运行的服务不是LocalSystem账户,是不允许与桌面交互的)

创建一个bat文件,写入以下代码,保存并双击运行,点击 y 回车更改服务账户

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\自己服务的名称/v ObjectName /t REG_SZ /d LocalSystem

如果想直接修改注册表,在以上代码前加"echo y|"   (没有双引号) 这样双击运行的时候就可以直接修改了

第三种解决办法也是最简单的办法,通过手动修改

打开服务控制器,右击要修改账户的服务属性,登录选项卡,修改为本地系统账户,并允许与桌面交互



2.服务如何获取程序当前的路径?

服务中使用Environment.CurrentDirectory获取的是system32的路径

解决办法:添加引用:window.form

使用Application.StartupPath(获取到程序生成的文件夹)

(其它方法暂时还没有尝试,所以先不写了)



3.如何使用Timer?

和form不同,服务有专门的Timer

右击工具箱"选择项",.netFrameWork组件:找到Timer

别搞成Form里的Timer



4服务的更新

服务有时候出了问题也会用到更新,安装服务机子少时候可以自己手动更新,多的话,像上百台或更多,在做需求的时候就要想到更新程序是如此的重要

我就是在这方面吃了大亏,请朋友们引以为戒

如两个服务A和B,B是某某服务,A是B的更新服务,想要实现的功能:系统启动时自动启动A服务来检测B服务是否有更新文件,有则下载更新,启动B服务,无则直接启动B服务

1.两个服务一定要分开两个项目来写,如果在一个项目里写两个服务,在更新的时候就会提示程序正在访问无法运行而更新失败

2.B服务要设置为手动启动,如果早与A服务自动启动。并且A服务检测到有更新文件,将无法完成B服务的更新

3.B服务设置为手动启动,并不是让你手动去启动B服务。是通过A来启动B。

启动方式如下:

条件:B服务为LocalSystem,并且B服务已经安装完成

利用进程启动B服务

public void RunService()
        {
            Process PortProcess = new Process();
            PortProcess.StartInfo.FileName = "cmd.exe";
            PortProcess.StartInfo.UseShellExecute = false;
            PortProcess.StartInfo.RedirectStandardInput = true;
            PortProcess.StartInfo.RedirectStandardOutput = true;
            PortProcess.StartInfo.RedirectStandardError = true;
            PortProcess.StartInfo.CreateNoWindow = true;
            try
            {
                PortProcess.Start();
                PortProcess.StandardInput.WriteLine("net start 服务的名称");
                PortProcess.StandardInput.WriteLine("exit");
                PortProcess.Close();
            }
            catch (Exception)
            {
            }
        }

其它方式有待改进,暂不贴出



多说都是泪,方法和思路都是自己试出来的,有什么代码或思路错误请朋友们提出,对的点个赞,谢谢~

时间: 2024-10-07 14:30:02

C# 开发windows服务的一些心得的相关文章

.net开发windows服务小结 (转发)

.net开发windows服务小结 今天学习了在.net下创建一个windows服务,总结一下学习心得. 开发环境:visual studio 2012 一.编写程序 (1)创建一个空解决方法 (2)添加一个控制台应用程序项目 (3)添加一个Windows服务,如下所示: (4)右键 查看代码 看到如下代码: public WindowsService() { InitializeComponent(); } protected override void OnStart(string[] ar

C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. 1 /// <summary> 2 /// 入口方法 3 /// </summary> 4 /// <param name="args">参数</param> 5 public static void Main(string[] args) 6 { 7 // 加载Log4net模块 8 LogHelper.SetConfig(&

win7下用c#开发windows服务

1.首选我们需要打开VS2008,然后点击文件-->新建-->项目,选择Visual C#-->windows-->windows服务.如下图所示: 2.然后修改Service1.cs类. 我们需要重写OnStart和OnStop方法.代码如下所示: [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat

.net开发windows服务小结

今天学习了在.net下创建一个windows服务,总结一下学习心得. 开发环境:visual studio 2012 一.编写程序 (1)创建一个空解决方法 (2)添加一个控制台应用程序项目 (3)添加一个Windows服务,如下所示: (4)右键 查看代码 看到如下代码: public WindowsService() { InitializeComponent(); } protected override void OnStart(string[] args) { } protected

使用Topshelf 开发windows服务

在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 windows service 相关的一些开发和安装部署,所以,windows service非常的不方便.Topshelf框架,能够让你将 console application 直接封装为 windows service,这样你在开发的时候,就可以直接在console 程序上开发,然后构成win

vs2015开发Windows服务

工作已经很久,时隔这么长时间写这篇文章是给自己以后做参考.也不至于以后长时间不写Windows服务而忘记整个开发过程.windows服务开发,基础的就不说了,直接上过程. 1.新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在一些低版本系统上无法正常运行. 2.添加Windows服务的安装程序. 在默认Service1设计器界面空白处点击右键->添加安装程序,系统会自动新建一个带有默认配置的安装程序类,如下图: 新建完安装程序后,需要给默认的se

C#开发Windows服务

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序. 服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面. 服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用. 还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务 一.创建服务 1.VS新建一个Windows服务项目,命名MyWindowsService

C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能.首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer来设置隔多长时间来下载.后来又想想了.用windwos服务来实现吧. 效果图: 执行的Log日志: INFO-2016/5/24 0:30:07--日志内容为:0/30/7进行time触发 INFO-2016/5/24 1:30:07--日志内容为:1/30/7进行time触发 INFO-2016/

C#开发可以可视化操作的windows服务

使用C#开发自定义windows服务是一件十分简单的事.那么什么时候,我们需要自己开发windows服务呢,就是当我们需要计算机定期或者一直执行我们开发的某些程序的时候.这里我以一个WCF的监听服务为例,因为我是做一个局域聊天室,需要服务器端监听终端,所以我就开发了一个服务,以便控制此监听服务.然而,我们开发的windows服务,默认情况下是无法可视化的操作的,这里我就额外的开发一个工具来对此服务进行操作,效果图如下: 开发步骤: 1."新建项目"--"Window服务&qu