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#服务:
- 使用
InstallUtil
安装服务。 (你好像你已经这样做了) - (如果需要) 将服务path更改为解决scheme的
bin
文件夹中生成的MyService.exe -
在服务的
OnStart()
方法的开始部分放置如下内容:while(true) { System.Threading.Thread.Sleep(500); }
-
在
System.Threading.Thread.Sleep(500)
上放置一个断点 -
build立解决scheme
-
使用Windows服务实用程序启动您的服务
-
当您的服务启动时,在VS2008转到
Debug -> Attach To Processes...
-
确保
Show Processes From All Users
Show Processes In All Sessions
和Show Processes In All Sessions
-
在列表中find您的MyService.exe,然后单击
Attach
-
你现在应该在你插入无限循环的断点处
-
将控制(黄色箭头)拖到无限循环的外面
-
debugging了!
免责声明:
记住当你想发布一个版本,或者你只是想正常运行服务时,删除无限循环。
这可能是服务名称不是你所期望的,这就是为什么你找不到它。 服务名称是在.NET项目的ServiceInstaller
属性中定义的,不必以任何方式与可执行文件名称相对应。 但是如果你确定这个服务在安装后没有列出,那么你可以这样做。
一,服务安装 有两种方法, InstallUtil.exe
和SC.exe
。 第一个是专门为.NET服务定制的,因为它将运行所有的ProjectInstaller
和ServiceInstaller
代码。 第二个不会这样做,但它会给你更多的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