我要调试Windows服务,但它会弹出一个错误信息说运行Windows服务作为一个控制台应用程序
无法从命令 线或调试器启动服务。必须使用 installutil.exe安装Windows服务 ,然后使用服务器资源管理器,Windows服务 管理工具或NET启动 命令以 开头。
我真的没有关于此错误的任何想法.....
我要调试Windows服务,但它会弹出一个错误信息说运行Windows服务作为一个控制台应用程序
无法从命令 线或调试器启动服务。必须使用 installutil.exe安装Windows服务 ,然后使用服务器资源管理器,Windows服务 管理工具或NET启动 命令以 开头。
我真的没有关于此错误的任何想法.....
前一个Windows服务可以运行,它必须“安装”首先使用installutil。 EG:
C:\installutil -i c:\path\to\project\debug\service.exe
然后你可以打开服务列表来启动它。 EG:
一旦开始,你可以去到Visual斯图dio,点击'Debug',然后点击'Attach to Process'。
另一种技术是这一行添加到您的OnStart()方法,在服务:
System.Diagnostics.Debugger.Launch();
当你做到这一点,它会提示你选择Visual Studio中的一个实例来调试服务。
另外,我发现在OnCommitted方法中使用下面的方法创建一个安装程序的效果非常好:使用(ServiceController sc = new ServiceController(__ SERVICENAME __)){sc.Start();} (或者您可以按照描述手动启动)。 –
对不起,但我无法执行此操作C:\ installutil -i c:\ path \ to \ project \ debug \ service.exe – pinki
manasareddy,当您尝试时会发生什么? –
您可以更改根据您是否是在调试模式下(通常是内部的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。我在这里复制了代码片段,因为它赞成完整的答案,而不是可能会消失一段时间的链接。
因此,这将只运行myServ.Process()并退出? –
基本上。保持繁忙是你的责任。 –
我的观点是它与运行服务不同。 –
请检查您是否处于“DEBUG”或“RELEASE”模式。当我尝试在“RELEASE”模式下调试服务时,出现此错误。当我将其改为“DEBUG”时,一切正常。
这是在您正确安装上述其他人建议的服务之后。
我有同样的错误。试过@C。劳伦斯的解决方案。虽然我发现我的服务在服务列表中运行,但仍然出现相同的错误。我已经阅读了一个建议在调试菜单中附加到进程的博客,看到我在进程列表中看不到我的服务。
我将不胜感激对此问题的可能解决方案的建议。
谢谢。
中将输出类型设置为控制台应用程序,这不应该是答案。它应该是一个评论或一个新的问题(如果没有这样的现有问题) – Joshua
是的,问题是我在这个地方是新的,无法评论,直到我得到50分或什么?对不起,搞砸了。无论如何感谢您的评论。 – CodeJammer
我想你需要以管理员权限运行才能连接到服务进程。您应该能够通过管理员命令提示符使用'sc queryex <服务名称>'来检查PID。您也可以单击附加到处理屏幕中的PID列标题,按PID排序。 –
为防止发生此错误并允许服务在常规服务控制器之外运行,您可以检查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
微软文档正在变得越来越好,谢谢添加链接。 – dare2k
可以发誓我解释之一[刚看到这样一个帖子(http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –