2011-03-01 71 views
21

我要调试Windows服务,但它会弹出一个错误信息说运行Windows服务作为一个控制台应用程序

无法从命令 线或调试器启动服务。必须使用 installutil.exe安装Windows服务 ,然后使用服务器资源管理器,Windows服务 管理工具或NET启动 命令以 开头。

我真的没有关于此错误的任何想法.....

enter image description here

+4

可以发誓我解释之一[刚看到这样一个帖子(http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –

回答

32

前一个Windows服务可以运行,它必须“安装”首先使用installutil。 EG:

C:\installutil -i c:\path\to\project\debug\service.exe 

然后你可以打开服务列表来启动它。 EG:

  1. 右键单击“我的电脑”
  2. 点击“管理”
  3. 打开“服务和应用程序”
  4. 点击“服务”
  5. 在列表中找到您服务,上右键单击它
  6. 单击“开始”

一旦开始,你可以去到Visual斯图dio,点击'Debug',然后点击'Attach to Process'。

另一种技术是这一行添加到您的OnStart()方法,在服务:

System.Diagnostics.Debugger.Launch(); 

当你做到这一点,它会提示你选择Visual Studio中的一个实例来调试服务。

+1

另外,我发现在OnCommitted方法中使用下面的方法创建一个安装程序的效果非常好:使用(ServiceController sc = new ServiceController(__ SERVICENAME __)){sc.Start();} (或者您可以按照描述手动启动)。 –

+1

对不起,但我无法执行此操作C:\ installutil -i c:\ path \ to \ project \ debug \ service.exe – pinki

+0

manasareddy,当您尝试时会发生什么? –

13

您可以更改根据您是否是在调试模式下(通常是内部的Visual Studio,但不一定是),或发布模式组件的启动模式(当它运行在生产服务):

更改此:

static class Program 
{ 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

到:

static class Program 
{ 
    static void Main() 
    { 
     #if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new MyService() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     #else 
      MyService myServ = new MyService(); 
      myServ.Process(); 
      // here Process is my Service function 
      // that will run when my service onstart is call 
      // you need to call your own method or function name here instead of Process(); 
     #endif 
    } 
} 

该技术是从this article采取和信用是文章的作者,Tejas的Vaishnav。我在这里复制了代码片段,因为它赞成完整的答案,而不是可能会消失一段时间的链接。

+0

因此,这将只运行myServ.Process()并退出? –

+0

基本上。保持繁忙是你的责任。 –

+0

我的观点是它与运行服务不同。 –

1

请检查您是否处于“DEBUG”或“RELEASE”模式。当我尝试在“RELEASE”模式下调试服务时,出现此错误。当我将其改为“DEBUG”时,一切正常。

这是在您正确安装上述其他人建议的服务之后。

0

我有同样的错误。试过@C。劳伦斯的解决方案。虽然我发现我的服务在服务列表中运行,但仍然出现相同的错误。我已经阅读了一个建议在调试菜单中附加到进程的博客,看到我在进程列表中看不到我的服务。

我将不胜感激对此问题的可能解决方案的建议。

谢谢。

+1

中将输出类型设置为控制台应用程序,这不应该是答案。它应该是一个评论或一个新的问题(如果没有这样的现有问题) – Joshua

+0

是的,问题是我在这个地方是新的,无法评论,直到我得到50分或什么?对不起,搞砸了。无论如何感谢您的评论。 – CodeJammer

+0

我想你需要以管理员权限运行才能连接到服务进程。您应该能够通过管理员命令提示符使用'sc queryex <服务名称>'来检查PID。您也可以单击附加到处理屏幕中的PID列标题,按PID排序。 –

1

为防止发生此错误并允许服务在常规服务控制器之外运行,您可以检查Environment.UserInteractive标志。如果已设置,则可以将输出运行到服务器而不是让它运行到返回该错误的ServiceBase代码。

一下添加到Program.Main()开始,在此之前使用ServiceBase的代码来运行服务:

 if (Environment.UserInteractive) 
     { 
      var service = new WindowsService(); 
      service.TestInConsole(args); 
      return; 
     } 

随着的OnStart和调用OnStop方法是在你的服务protected你需要添加另一个方法是类,你可以从主(运行),并调用这些方法适合你,比如:

public void TestInConsole(string[] args) 
    { 
     Console.WriteLine($"Service starting..."); 
     this.OnStart(args); 
     Console.WriteLine($"Service started. Press any key to stop."); 
     Console.ReadKey(); 
     Console.WriteLine($"Service stopping..."); 
     this.OnStop(); 
     Console.WriteLine($"Service stopped. Closing in 5 seconds."); 
     System.Threading.Thread.Sleep(5000); 
    } 

最后,确保输出是在项目的属性控制台应用程序。

您现在可以像运行其他任何程序一样运行服务可执行文件,它将作为控制台启动。如果你从Visual Studio启动它,调试器将自动附加。如果您注册并将其作为服务启动,它将作为服务正常运行而不会发生任何更改。

我发现的唯一区别是,当作为控制台应用程序运行时,代码不会写入事件日志,您可能希望输出通常会在该处记录的任何内容到控制台。

该服务的调试技术是那些在docs.microsoft.com

+0

微软文档正在变得越来越好,谢谢添加链接。 – dare2k

相关问题