27

Как запустить проект службы Windows из визуальной студии.Как запустить (F5) сервис Windows из визуальной студии

Я строю окна serivce в visual studio 2008, я должен всегда запускать службу с панели управления, а затем присоединять отладчик к запущенному экземпляру службы. Его раздражает, так как я убираю много кода и многократно запускаю свою службу во время разработки.

Я хочу настроить свой проект, чтобы иметь возможность ударить F5 и запустить службу и напрямую войти в режим отладки. Некоторые советы о том, как достичь этого, будут отличными.

Заранее благодарен!

+0

Посмотрите эту статью Http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Он также относится к следующим статьям: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx – 2012-05-10 10:37:52

ответ

6

В вашей Main() рутинной проверке на Debugger.IsAttached, и если это правда, начните свое приложение, как будто это консоль, если нет, позвоните в ServiceBase.Run().

2

Создайте отдельный проект, который просто ссылается на проект службы и создает экземпляр и запускает сервис. Он просто работает как обычное приложение, и вы можете войти в него.

YourService s = new YourService(); 
s.Start(); 
25

Код: here.

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 или запустить новый пример. На самом деле это механизм, который я использую для отладки моего сервиса.

+3

Инструкции по этой ссылке отлично работают для меня. Благодаря! –

+0

Просто FYI, в Windows 8, похоже, что они внесли некоторые изменения в службы Windows и значительно сократили их способность делать интерактивные вещи. Debugger.Launch() и Debugger.Break() больше не запускают диалог GUI, который позволяет вам выбирать и IDE для отладки, поэтому служба просто зависает. FYI –

2

Просто позвоните событие OnStart() из конструктора службы

Я сделал это следующим образом

public XXX() 
    { 
     InitializeComponent(); 
     OnStart(new string[] { "shafi", "moshy" }); 
    } 
0

Вы хотите, чтобы ваши службы Windows в качестве оболочки, не должно быть мало кода в так что вам не нужно его проверять.

У вас должно быть все, что вы хотите, чтобы ваш сервис выполнял в классе.

Вы можете выполнить тестирование вашего класса, и если он будет работать, обратитесь к нему.

Этот способ, когда у вас есть класс, делающий все, что вам нужно, тогда, когда он применяется к вашему сервису, каждая вещь должна работать. :)

Будет ли журнал событий вы можете видеть, что делает ваша служба во время ее работы, а также хороший способ проверить: 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"); 
     } 
     } 
    } 
0

Эти ссылки могут быть очень полезными при работе с услугами.

Это прогулка, хотя на их создание http://msdn.microsoft.com/en-us/library/zt39148a.aspx

Джеймс Майкл Заяц на своем блоге http://geekswithblogs.net/BlackRabbitCoder/ писала о действительно хорошем шаблоне/рамке он сделал, что делает его намного проще для разработки (и отладки) Служба Windows : C# Toolbox: отлаживаемый, настраиваемый шаблон службы Windows (1 из 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

Он предоставляет вам все основы, необходимые для быстрого начала работы. И самое главное, это дает вам отличный способ отладить ваш сервис, как если бы это было обычное консольное приложение. Я мог бы также упомянуть, что он предоставляет из коробки функциональность для установки (и удаления) вашей службы. Вторую часть сообщения можно найти по этой ссылке.

Я использовал это сам пару раз и могу действительно рекомендовать его.

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 
    } 
    } 
} 
2

Вы также можете сделать это: (см комментарии для объяснения)

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(); 
    }  
} 
Смежные вопросы