I\'ve got a windows service written in C#. I\'ve read all the google threads on how to debug it, but I still can\'t get it to work. I\'ve run \"PathTo.Net
It can be that service name is not what you expect and that's why you can't find it. Service name is defined in ServiceInstaller
properties in .NET project and does not have to correspond with executable name in any way. But if you're sure the service is not listed after installation, here is what you can do.
First, service installation. There are 2 methods, InstallUtil.exe
and SC.exe
. First one is tailored specifically for .NET services as it will run all ProjectInstaller
and ServiceInstaller
code. Second one will not do that but it will give you more options and is usually more effective i.e. likely to succeed where InstallUtil
fails. This can be when there is an exception in any installer code.
You've already tried installing with InstallUtil
so here is SC
version:
sc create MyService binPath= "C:\Service.exe"
Note that MyService
is the name you give to the service at this point and it can be anything you like (within reason :-). This name will be shown in services console list.
Once you have your service installed you would need to debug it right when OnStart
is called. This can be achieved by running and attaching to a debugger (Visual Studio) from within the service:
protected override void OnStart(string[] args)
{
#if DEBUG
Debugger.Launch();
#endif
...
}
Do not forget to build and replace service executable after this code change. Service must be stopped but no need to uninstall and reinstall it.
To delete service using SC
:
sc delete MyService
Assumptions:
1) You have the source code available in a Solution in the VS2008 IDE
How I Debug C# Services:
InstallUtil
. (You seem like you've already done that)bin
folderPut something like the following at the beginning of your Service's OnStart()
method:
while(true)
{
System.Threading.Thread.Sleep(500);
}
Put a breakpoint on System.Threading.Thread.Sleep(500)
Build the Solution
Start your Service using the Windows Service Utility
While your Service is starting, in VS2008 goto Debug -> Attach To Processes...
Make sure Show Processes From All Users
and Show Processes In All Sessions
are checked
Find your MyService.exe in the list, and click Attach
You should now be at the breakpoint you inserted in the infinite loop
Drag the Control (Yellow Arrow) just outside the infinite loop
Debug away!
Disclaimer:
Remember to remove the infinite loop when you want to release a build, or when you simply want to run the service normally.
you can debug it by attaching the debugger to the process. You can do this by either adding a line to the startup of your program:
Debugger.Launch ();
after adding the using statement:
using System.Diagnostics;
you will either need to put that in a conditional block or remove it when you are done debugging
or by running the service and then attaching to the process manually from the IDE: Debug->Attach to process..
We can make the windows service project debuggable by just adding a parameter and making it behave like a console app.
1) Go to your windows service project properties -> Debug -> Start Options 2) Give an argument -Console 3) Go to Application tab -> output type, change it to Console Application 4) Type the below code in 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();
}
}
If your business layer is seperate from the windows service you can test all of your business functions outside of running the windows service.
To test the windows service I like to create a test project that is a console app and I start a new thread that runs my service.
System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();