Подтвердить что ты не робот

Как запустить (F5) сервис windows из visual studio

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

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

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

Спасибо заранее!

4b9b3361

Ответ 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

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

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