Как запустить (F5) сервис windows из visual studio
Как запустить проект службы Windows из визуальной студии.
Я создаю серию окон в visual studio 2008, я должен всегда запускать службу с панели управления, а затем присоединять отладчик к запущенному экземпляру службы. Его раздражает, так как я очищаю много кода и многократно запускаю свою службу во время разработки.
Я хочу настроить свой проект, чтобы иметь возможность ударить F5 и запустить службу и напрямую войти в режим отладки. Некоторые советы о том, как достичь этого, будут отличными.
Спасибо заранее!
Ответы
Ответ 1
Скопировано из здесь.
static void Main(string[] args)
{
DemoService service = new DemoService();
if (Environment.UserInteractive)
{
service.OnStart(args);
Console.WriteLine("Press any key to stop program");
Console.Read();
service.OnStop();
}
else
{
ServiceBase.Run(service);
}
}
Это должно позволить вам запускать из Visual Studio.
Другим способом было бы включить программную точку останова в ваш код, вызвав System.Diagnostics.Debugger.Break()
. Когда вы разместите это, скажем, обратный вызов OnStart() вашего сервиса и запустите службу из консоли Services, программная точка останова вызовет диалоговое окно, которое позволит вам подключиться к существующему экземпляру Visual Studio или запустить новый пример. На самом деле это механизм, который я использую для отладки моего сервиса.
Ответ 2
В вашей процедуре Main()
проверьте Debugger.IsAttached
, и если она верна, запустите свое приложение, как будто это консоль, если нет, вызовите ServiceBase.Run()
.
Ответ 3
Можно создать сопутствующий проект Службе Windows, который запускается как консольное приложение, но получает доступ к методам службы с использованием Reflection. См. Здесь подробности и пример: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/.
Вот соответствующий код, который вам понадобится в консольном приложении:
using System;
using System.Reflection;
namespace TestableWindowsService
{
class TestProgram
{
static void Main()
{
Service1 service = new Service1();
Type service1Type = typeof (Service1);
MethodInfo onStart = service1Type.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Instance); //retrieve the OnStart method so it can be called from here
onStart.Invoke(service, new object[] {null}); //call the OnStart method
}
}
}
Ответ 4
Создайте отдельный проект, который просто ссылается на проект службы и создает экземпляр и запускает службу. Он просто работает как обычное приложение, и вы можете в него вступить.
YourService s = new YourService();
s.Start();
Ответ 5
Просто вызовите событие OnStart() из конструктора службы
Я сделал это следующим образом
public XXX()
{
InitializeComponent();
OnStart(new string[] { "shafi", "moshy" });
}
Ответ 6
Вы также можете сделать это: (См. комментарии для объяснения)
public class Program : ServiceBase
{
private ServiceHost _serviceHost = null;
public Program()
{
ServiceName = "";
}
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
#if(!DEBUG)
// when deployed(built on release Configuration) to machine as windows service use this
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new Program() };
ServiceBase.Run(ServicesToRun);
#else
// when debugging use this (When debugging after building in Debug Configuration)
//If you want the DEBUG preprocessor constant in Release you will have to check it on in the project configuration
Program progsvc = new Program();
progsvc.OnStart(new string[] { });
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif
}
protected override void OnStart(string[] args)
{
// Start Web Service
if (_serviceHost != null)
{
_serviceHost.Close();
}
_serviceHost = new ServiceHost(typeof(Namespace.Service));
_serviceHost.Open();
}
}
Ответ 7
Вы хотите, чтобы ваша служба Windows была оболочкой, там должен быть небольшой код, поэтому вам не нужно его тестировать.
У вас должно быть все, что вы хотите, чтобы ваш сервис выполнял в классе.
Вы можете unit test вы класс, и если он будет работать, обратитесь к его службе.
Таким образом, когда у вас есть класс, который делает все, что вам нужно, тогда, когда он применяется к вашему сервису, каждая вещь должна работать.:)
Будет ли в журнале событий вы можете видеть, что делает ваша служба во время работы, а также хороший способ проверить: D попробуйте это.
namespace WindowsService
{
public partial class MyService : ServiceBase
{
public MyEmailService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource")) // Log every event
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource", "MyNewLog"); // Create event source can view in Server explorer
}
eventLogEmail.Source = "MySource";
eventLogEmail.Log = "MyNewLog";
clsRetriveEmail Emails = new clsRetriveEmail();
eventLogEmail.WriteEntry("Populateing database with mail"); // log event
Emails.EmailGetList(); // Call class
}
protected override void OnStart(string[] args)
{
eventLogEmail.WriteEntry("Started");
}
protected override void OnStop()
{
eventLogEmail.WriteEntry("Stopped");
}
protected override void OnContinue()
{
eventLogEmail.WriteEntry("Continuing");
}
}
}
Ответ 8
Эти ссылки могут быть очень полезны при работе с сервисами.
Это прогулка, хотя при их создании
http://msdn.microsoft.com/en-us/library/zt39148a.aspx
Джеймс Майкл Харе в своем блоге http://geekswithblogs.net/BlackRabbitCoder/ написал о действительно хорошем шаблоне/структуре, который он сделал, что значительно облегчает разработку (и отладка) Службы Windows: С# Toolbox: отлаживаемый, самоустанавливающийся шаблон службы Windows (1 из 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx
Он предоставляет вам все основы, необходимые для быстрого начала работы. И самое главное, это дает вам отличный способ отладить ваш сервис, как если бы это было обычное консольное приложение. Я мог бы также упомянуть, что он предоставляет из коробки функциональность для установки (и удаления) вашей службы. Часть вторая сообщения можно найти по этой ссылке.
Я использовал это сам пару раз и могу действительно рекомендовать его.