C# 调试Windows服务 脚本

C# 调试Windows服务 脚本,c#,windows-services,debugging,C#,Windows Services,Debugging,我有一个用C写的windows服务。 我已经阅读了所有关于如何调试它的谷歌线程,但我仍然无法让它工作。 我已经运行了“PathTo.NetFramework\InstallUtil.exe C:\MyService.exe”。它说安装成功了,但是当我运行“Services.msc”时,该服务在任何地方都不会显示。如果我进入任务管理器,有一个名为“MyService.vshost.exe”的进程。很肯定不是这样,因为这是一个服务,不是一个过程 有人能给我解释一下吗? 如果我运行Services.m

我有一个用C写的windows服务。 我已经阅读了所有关于如何调试它的谷歌线程,但我仍然无法让它工作。 我已经运行了“PathTo.NetFramework\InstallUtil.exe C:\MyService.exe”。它说安装成功了,但是当我运行“Services.msc”时,该服务在任何地方都不会显示。如果我进入任务管理器,有一个名为“MyService.vshost.exe”的进程。很肯定不是这样,因为这是一个服务,不是一个过程

有人能给我解释一下吗? 如果我运行Services.msc时应该看到服务? (请记住,这一切都是在本地机器上完成的,根本没有服务器

其他 我正在运行VS2008

编辑: 这一切都是在我的本地机器上完成的,我没有服务器或访问任何服务器。 另外,我甚至不知道该服务是做什么的,我想对其进行调试,这样我就可以浏览代码并了解它是如何工作的(服务内部的代码,而不是服务本身——对于任何一个聪明的人来说,这可能会建议我查看模板)

编辑2: 这些都没用! 每次我尝试一些东西,我都会得到一些关于必须使用NetStart或安装服务的信息

编辑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)微软公司。保留所有权利

正在运行事务处理安装

开始安装的安装阶段。 请参阅C:\dev\Restarter\bin日志文件的内容\ Release\Restarter.exe程序集的进度。 该文件位于C:\dev\Restarter\bin\Release\EDT.Restar 安装日志。 正在安装程序集“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 安装日志。 正在提交程序集“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>

然后我去运行->Services.msc 我在那里什么也看不见

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

就这样

我只想安装和调试它。 我知道它可以工作(因为它运行并且不会崩溃)。
但是代码是由一位朋友编写的,我想通过在调试模式下浏览来了解底层代码。

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

 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);
 }

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

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

Debugger.Launch ();
添加using语句后:

using System.Diagnostics; 
您需要将其放入条件块中,或者在调试完成后将其删除


或者通过运行服务,然后从IDE手动附加到进程:调试->附加到进程..

如果您的业务层与windows服务分离,则可以测试运行windows服务之外的所有业务功能

System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();
为了测试windows服务,我想创建一个测试项目,它是一个控制台应用程序,然后启动一个运行我的服务的新线程

System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();

我最近将此添加到一个项目中,它对我非常有用。您可以像调试任何其他EXE一样调试它。添加后,转到项目属性,并在调试生成配置的“调试”选项卡中添加命令行参数(/EXE)

<MTAThread()> _
Shared Sub Main()

    '' 
    '' let's add a command line parameter so we can run this as a regular exe or as a service
    ''
    If Command().ToUpper() = "/EXE" Then
        Dim app As MyService = New MyService()

        app.OnStart(Nothing)
        Application.Run()
    Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If
End Sub
_
共享子主目录()
'' 
“”让我们添加一个命令行参数,以便可以将其作为常规exe或服务运行
''
如果Command().ToUpper()=“/EXE”,则
Dim app As MyService=New MyService()
app.OnStart(无)
Application.Run()
其他的
Dim ServicesToRun()作为System.ServiceProcess.ServiceBase
'同一进程中可能运行多个NT服务。若要添加
'对于此进程的另一个服务,请将以下行更改为
'创建第二个服务对象。例如,
'
'ServicesToRun=New System.ServiceProcess.ServiceBase(){New Service1,New MySecondUserService}
'
ServicesToRun=New System.ServiceProcess.ServiceBase(){New MyService}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
如果结束
端接头

假设:

1) 您在VS2008 IDE的解决方案中有可用的源代码

如何调试C#服务:

  • 使用
    InstallUtil
    安装服务。(你好像已经这么做了)
  • (如果需要)添加到解决方案的
    bin
    文件夹中生成的MyService.exe
  • 在服务的
    OnStart()
    方法的开头添加如下内容:

    while(true)
    {
       System.Threading.Thread.Sleep(500);
    }
    
  • System.Threading.Thread.Sleep(500)

  • 构建解决方案

  • 使用

  • 服务启动时,在VS2008中转到
    Debug->attachtoprocesss…

  • 确保选中了所有用户的
    显示流程
    和所有会话中的
    显示流程

  • 在列表中找到MyService.exe,然后单击“附加”

  • 你现在应该
    sc create MyService binPath= "C:\Service.exe"
    
    protected override void OnStart(string[] args)
    {
        #if DEBUG
        Debugger.Launch();
        #endif
        ...
    }
    
    sc delete MyService
    
    #if DEBUG
        MyService myService = new MyService();
        myService.OnDebug();
        System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    #else
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new MyService()
        };
        ServiceBase.Run(ServicesToRun);
    #endif
    
        public void OnDebug()
        {
            OnStart(null);
        }