как запустить (F5) службу Windows из Visual Studio - PullRequest
29 голосов
/ 13 февраля 2010

Как запустить проект службы Windows из Visual Studio.

Я создаю Windows Serivce в Visual Studio 2008, мне нужно всегда запускать сервис из панели управления, а затем подключать отладчик к запущенному экземпляру сервиса. Это немного раздражает, так как я очищаю много кода и мне нужно многократно перезапускать сервис во время разработки.

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

Заранее спасибо !!!

Ответы [ 8 ]

28 голосов
/ 13 февраля 2010

Скопировано с здесь .

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 () вашей службы и запускаете службу из консоли служб, программная точка останова вызовет диалоговое окно, которое позволяет подключиться к существующему экземпляру Visual Studio или запустить пример. На самом деле это механизм, который я использую для отладки своего сервиса.

7 голосов
/ 13 февраля 2010

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

4 голосов
/ 20 июля 2012

Можно настроить сопутствующий проект для службы 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 голосов
/ 08 августа 2013

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

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();
    }       
}
2 голосов
/ 14 августа 2011

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

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

    public XXX()
    {
        InitializeComponent();
        OnStart(new string[] { "shafi", "moshy" });
    }
2 голосов
/ 13 февраля 2010

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

YourService s = new YourService();
s.Start();
0 голосов
/ 10 мая 2012

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

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

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

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

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

0 голосов
/ 10 мая 2012

Вы хотите, чтобы ваша служба 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");
        }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...