调试Windows服务

Goo*_*ber 41 c# debugging windows-services

脚本

我有一个用C#编写的Windows服务.我已经阅读了有关如何调试它的所有谷歌线程,但我仍然无法让它工作.我运行了"PathTo.NetFramework\InstallUtil.exe C:\ MyService.exe".它表示安装成功,但是当我运行"Services.msc"时,该服务根本不显示在任何地方.如果我进入任务管理器,有一个名为"MyService.vshost.exe"的进程.很确定不是它,因为它是一种服务,而不是一个过程.

有人可以向我解释一下吗?

如果我在运行Services.msc时应该看到该服务?(请记住,这一切都是在本地机器上完成的,没有任何服务器.

其他

我正在运行VS2008.

编辑:

这一切都是在我的本地机器上完成的,我没有服务器或访问任何服务器.另外,我甚至不知道服务做什么,我想调试它,所以我可以演练代码,看看它所有的作品(里面的服务代码,而不是服务本身如何 - 任何你Smarty的裤子可能建议我看一个模板).

编辑2:

这些都没有工作!每当我尝试一些东西时,我都会得到一些关于必须使用NET START或安装服务的消息.

编辑3:

我正在运行VS2008.

我键入:C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\ dev\Restarter\bin\Release\Restarter.exe

我得到了这个:Microsoft(R).NET Framework安装实用程序版本2.0.50727.3053版权所有(c)Microsoft Corporation.版权所有.

运行事务安装.

开始安装的安装阶段.请参阅日志文件的内容以获取C:\ dev\Restarter\bin\Release\Restarter.exe程序集的进度.该文件位于C:\ dev\Restarter\bin\Release\EDT.Restar ter.InstallLog.安装程序集'C:\ dev\Restarter\bin\Release\Restarter.exe'.受影响的参数是:logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog

安装阶段成功完成,提交阶段正在开始.请参阅日志文件的内容以获取C:\ dev\Restarter\bin\Release\Restarter.exe程序集的进度.该文件位于C:\ dev\Restarter\bin\Release\Restar ter.InstallLog.提交程序集'C:\ dev\Restarter\bin\Release\Restarter.exe'.受影响的参数是:logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog

提交阶段成功完成.

事务处理安装已完成.

C:\ Program Files\Microsoft Visual Studio 9.0\VC>

然后我去了RUN - > Services.msc我什么都看不到.

任务管理器中有一个名为"Restarter.vshost.exe"的进程.

而已.

我只想安装和调试它.我知道它有效(因为它运行并且不会崩溃).但代码是由朋友编写的,我希望通过在调试模式下遍历它来理解底层代码.

And*_*rey 116

我建议使用以下模式进行调试:

 var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }
Run Code Online (Sandbox Code Playgroud)

编辑:确保您的目标是控制台应用程序,而不是Windows应用程序,否则它将无法正常工作.

  • +1我的服务上没有.Start方法所以我添加1.希望它不是我错过的东西 (10认同)
  • 这很好,我曾经是一个`#define X`和`#if X`来控制作为服务运行而不是作为控制台应用程序运行,这肯定更优雅和更清洁.我希望我可以多投票几次. (3认同)

Sam*_*der 23

您可以通过将调试器附加到进程来调试它.您可以通过在程序启动时添加一行来完成此操作:

Debugger.Launch ();
Run Code Online (Sandbox Code Playgroud)

添加using语句后:

using System.Diagnostics; 
Run Code Online (Sandbox Code Playgroud)

您需要将它放在条件块中,或者在完成调试后将其删除

或者通过运行服务然后从IDE手动附加到流程:Debug-> Attach to process ..

  • 对我来说这是一个了不起的发现我建议每个人都使用它,但有一个问题.你需要在推出之前删除它,所以我建议将其包装在#DEBUG #endif ...如果你在发布中推出:) (5认同)

Lav*_*nya 6

我们可以通过添加一个参数并使其表现得像一个控制台应用程序来使Windows服务项目可调试.

1)转到Windows服务项目属性 - >调试 - >启动选项2)给出参数-Console 3)转到应用程序选项卡 - >输出类型,将其更改为控制台应用程序4)在Program.cs中键入以下代码

static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);
        }

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }
Run Code Online (Sandbox Code Playgroud)

  • 在Service1.cs文件中添加一个方法internal void InternalStart(){OnStart(null); }和一个停止方法internal void InternalStop(){OnStop(); } (2认同)

Ron*_*rby 5

在开发/调试Windows服务时,这对我帮助很大:

http://windowsservicehelper.codeplex.com/

只需按F5即可进行调试.很容易.

安德烈的方法也非常好.