在.NET中构buildWindows服务的build议stream程是什么?

我对Windows服务的开发很陌生(我的背景是在Web开发中),对于Windows服务的开发过程我有点困惑。

据我了解,每次编译代码时都必须安装该服务,然后从服务MMCpipe理单元中运行。

这似乎是一个非常痛苦的过程,每次你去改变你的代码。

有人可以通过build议的方式来了解build筑服务吗?

谢谢

为了调试服务,我通常使用下面的Main样板:

 static void Main() { ServiceBase[] servicesToRun = new ServiceBase[] { new MyService(); }; #if !DEBUG //run the service normally using ServiceBase.Run ServiceBase.Run(servicesToRun); #else //debug the process as a non-service by invoking OnStart and then sleeping foreach (ServiceBase s in servicesToRun) { var serviceType = s.GetType(); var onStartMethod = serviceType.GetMethod("OnStart", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); onStartMethod.Invoke(s, new object[] { new string[0] }); } Debug.WriteLine("done starting services"); while (true) Thread.Sleep(200); #endif } 

这样做是使用反射来获得每个服务的OnStart保护方法,调用它,然后坐在睡眠循环,以保持进程运行。

这个例子假设MyService是从ServiceBase继承的服务类,它覆盖了OnStart以生成线程并完成它的工作。

在这里,我使用DEBUG编译时常量作为是否正常启动或作为非服务调试的控制因素。 如果DEBUG被定义,它将作为非服务在进程中运行。 否则,它会正常的调用ServiceBase.Run 。 随意使用一个命令行参数或任何最适合你的。

您可能需要进行一些调整或重新设置大部分逻辑来控制应用程序,以便于测试和调试,因为开箱即用是非常痛苦的。

这里有一些资源:

http://candordeveloper.com/2012/12/27/debugging-a-windows-service-application-without-install/

运行Windows服务应用程序而不安装它

 the easiest of them might be putting #if DEBUG //your logic #endif in your logic, putting a breakpoint and hitting F5, this is what i do most of the time. 

将有趣的知道,如果有更好的办法:)

来自Bravo 11和Ic的答案。 给一些好的提示和技巧。 我会添加一些:

请注意,作为服务运行也对登录/安全上下文有一些影响:

  • 在SYSTEM下运行,您不能正常访问网络文件共享(但是有一种方法将机器帐户添加到ACL)

  • (域)用户帐户下运行需要“登录为服务”权限,这是恕我直言,企业环境中的服务启动问题(GPO设置可能会调整)的最常见的原因。 此外,您无法访问桌面,因此如果弹出窗口将显示等待用户,服务将挂起。

  • 在开发阶段,如果服务当前没有运行而没有卸载/安装,则可以交换DLL甚至EXE

  • 广泛使用Windows事件日志。

服务和“正常应用程序”之间的这些差异对我来说足够重要,可以让它尽可能地直接在服务器上运行。

在我的服务中,我使用:

 protected override void OnStart(string[] args) { // this is not just a simple message, this has to be called very early before any worker thread // to prevent a race condition in the .NET code of registering the event source EventLog.WriteEntry("XXXXService is starting", EventLogEntryType.Information, 1000); .... 

不要忘记, OnStart()OnStop()不应该包含长时间运行的代码。 您通常在OnStart()启动一个工作线程,直到某个通知(在OnStop设置)被触发为止。