debuggingWindows服务

脚本

我有用C#编写的Windows服务。 我已经阅读了所有关于如何debugging它的谷歌线程,但我仍然无法得到它的工作。 我已经运行了“PathTo.NetFramework \ InstallUtil.exe C:\ MyService.exe”。 它表示安装成功,但是当我运行“Services.msc”时,该服务根本不显示在任何地方。 如果我进入任务pipe理器,有一个名为“MyService.vshost.exe”的进程。 可以肯定的不是这样,因为这是一种服务,而不是一个过程。

有人可以向我解释吗?

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

其他

我正在运行VS2008。

编辑:

这一切都在我的本地机器上完成,我没有服务器或访问任何。 另外,我甚至不知道这个服务是干什么的,我想debugging它,这样我就可以浏览代码,看看它是如何工作的(服务中的代码,而不是服务本身 – 对于你们任何一个聪明的裤子build议我看一下模板)。

编辑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,我什么都看不到。

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

而已。

我只想安装和debugging它。 我知道它的作品(因为它运行,不会崩溃)。 但是代码是由朋友编写的,我想通过在debugging模式下通过它来了解底层代码。

我build议以下模式进行debugging:

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应用程序,否则将无法正常工作。

您可以通过将debugging器附加到进程来进行debugging。 您可以通过在程序启动时添加一行来实现:

 Debugger.Launch (); 

在添加using语句之后:

 using System.Diagnostics; 

你将需要把它放在一个条件块中,或者在你完成debugging的时候把它删除

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

我们可以通过添加一个参数,使它像一个控制台应用程序的行为,使Windows服务项目可debugging。

1)转到你的Windows服务项目属性 – >debugging – >启动选项2)给一个参数-Console 3)转到应用程序选项卡 – >输出types,将其更改为控制台应用程序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(); } } 

这在开发/debuggingWindows服务时帮助了我很多:

http://windowsservicehelper.codeplex.com/

只需按F5进行debugging。 好简单。

安德烈的做法也非常好。

为了能够在不进行部署的情况下debugging我的服务,我总是按照以下方式编写它:

在你的program.cs文件中:

 #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 

并在您的MyService.cs文件中:

  public void OnDebug() { OnStart(null); } 

*注意* :当您最终完成debugging并且您准备部署该服务时,您必须在“发布”模式下构build,否则该服务将不被视为服务。

希望这可以帮助。

假设:

1)您在VS2008 IDE中的解决scheme中提供了源代码

我如何debuggingC#服务:

  1. 使用InstallUtil安装服务。 (你好像你已经这样做了)
  2. (如果需要) 将服务path更改为解决scheme的bin文件夹中生成的MyService.exe
  3. 在服务的OnStart()方法的开始部分放置如下内容:

     while(true) { System.Threading.Thread.Sleep(500); } 
  4. System.Threading.Thread.Sleep(500)上放置一个断点

  5. build立解决scheme

  6. 使用Windows服务实用程序启动您的服务

  7. 当您的服务启动时,在VS2008转到Debug -> Attach To Processes...

  8. 确保Show Processes From All Users Show Processes In All SessionsShow Processes In All Sessions

  9. 在列表中find您的MyService.exe,然后单击Attach

  10. 你现在应该在你插入无限循环的断点处

  11. 将控制(黄色箭头)拖到无限循环的外面

  12. debugging了!

免责声明:

记住当你想发布一个版本,或者你只是想正常运行服务时,删除无限循环。

这可能是服务名称不是你所期望的,这就是为什么你找不到它。 服务名称是在.NET项目的ServiceInstaller属性中定义的,不必以任何方式与可执行文件名称相对应。 但是如果你确定这个服务在安装后没有列出,那么你可以这样做。

一,服务安装 有两种方法, InstallUtil.exeSC.exe 。 第一个是专门为.NET服务定制的,因为它将运行所有的ProjectInstallerServiceInstaller代码。 第二个不会这样做,但它会给你更多的select,通常更有效,即可能成功的地方InstallUtil失败。 这可以是任何安装程序代码中有exception的情况。

您已经尝试使用InstallUtil安装,因此这里是SC版本:

 sc create MyService binPath= "C:\Service.exe" 

请注意, MyService在此时向服务提供的名称,可以是任何您喜欢的(理由:-)。 该名称将显示在服务控制台列表中。

一旦你安装了你的服务,你需要在调用OnStart时候debugging它。 这可以通过在服务中运行并附加到debugging器(Visual Studio)来实现:

 protected override void OnStart(string[] args) { #if DEBUG Debugger.Launch(); #endif ... } 

此代码更改后,不要忘记构build和replace服务可执行文件。 服务必须停止,但不需要卸载并重新安装。

使用SC删除服务:

 sc delete MyService 

如果您的业务层与Windows服务分离,则可以在运行Windows服务之外testing所有业务function。

为了testingWindows服务,我喜欢创build一个testing项目,它是一个控制台应用程序,并启动一个运行我的服务的新线程。

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

我最近添加了这个项目,它对我很好。 您可以像debugging其他EXE一样进行debugging。 添加完成后,转至您的项目属性,并在“debugging”构buildconfiguration的“debugging”选项卡中添加一个命令行参数(/ 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 

我build议在项目属性debugging选项卡上添加/test作为开始选项。 那么你可以运行你的服务,而无需安装它。

如果您使用TopShelf创build服务,则应该可以从Visual Studio中轻松进行debugging