it-swarm.com.ru

как запустить (F5) службу Windows из Visual Studio

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

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

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

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

28
dotnetcoder

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

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

27
Matt Davis

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

6
Samuel Neff

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

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

YourService s = new YourService();
s.Start();
2
Patrick Kafka

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

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
MannyRamirez

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

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

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

Вы хотите, чтобы ваш 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
Pomster

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

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

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

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

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

0
Pomster