27

Jak uruchomić projekt usługi Windows z wizualnego studia.jak uruchomić usługę okienkową (F5) ze studia wizualnego

Buduję serię okien w visual studio 2008, muszę zawsze uruchomić usługę z panelu sterowania, a następnie dołączyć debugger do działającej instancji usługi. Jest to dość denerwujące, ponieważ czyszczę dużo kodu i muszę wielokrotnie uruchamiać moją usługę podczas programowania.

Chcę skonfigurować mój projekt, aby móc nacisnąć klawisz F5 i uruchomić usługę i przejść bezpośrednio do trybu debugowania. Kilka wskazówek, jak to osiągnąć, byłoby świetne.

Z góry dziękuję !!!

+0

Patrz artykuł http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Dotyczy to również następujących artykułów: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

Odpowiedz

6

W swojej rutynowej kontroli 01 dla Debugger.IsAttached i jeśli to prawda, uruchom aplikację tak, jakby była konsolą, jeśli nie, zadzwoń pod ServiceBase.Run().

2

Utwórz oddzielny projekt, który po prostu odwołuje się do projektu usługi i utworzyć instancję oraz uruchomić usługę. Działa po prostu jak zwykła aplikacja i możesz do niej wejść.

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

Skopiowano z 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); 
    } 
} 

To powinno umożliwić uruchamianie z poziomu Visual Studio.

Innym sposobem jest osadzenie programowego punktu przerwania w kodzie przez wywołanie System.Diagnostics.Debugger.Break(). Po umieszczeniu tego w, powiedzmy, wywołaniu zwrotnym OnStart() usługi i uruchomieniu usługi z konsoli Usługi, programowy punkt przerwania uruchomi okno dialogowe, które umożliwia dołączenie do istniejącej instancji Visual Studio lub rozpoczęcie nowej instancja. Jest to właściwie mechanizm, którego używam do debugowania mojej usługi.

+3

Instrukcje pod tym linkiem działają doskonale dla mnie. Dzięki! –

+0

Po prostu dla FYI, w systemie Windows 8, wydaje się, że wprowadzili kilka zmian w usługach systemu Windows i znacznie ograniczają możliwość wykonywania interaktywnych zadań. Debugger.Launch() i Debugger.Break() nie wydają się już uruchamiać okna dialogowego GUI, które pozwoliło ci wybrać i IDE do debugowania, aby usługa się zawiesiła. FYI –

2

Wystarczy zadzwonić pod OnStart() zdarzenie z konstruktora usług

zrobiłem to w następujący sposób

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

chcesz mieć swoją usługę Windows jako powłoki, nie powinno być trochę kodu w tam, więc nie musisz tego testować.

Powinieneś mieć wszystko, co chcesz, aby Twoja usługa była wykonywana w klasie.

Możesz testować swoją klasę, a jeśli działa, odwołaj ją do swojej usługi.

W ten sposób, gdy masz klasę, robiąc wszystko, co chcesz, a kiedy zastosujesz ją do swojej usługi, wszystko powinno działać. :)

Czy dziennik zdarzeń będzie mógł zobaczyć, co robi twoja usługa podczas pracy, a także dobry sposób na sprawdzenie: D spróbuj tego.

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

Linki te mogą być bardzo pomocne podczas pracy z usługami.

ten znajduje się w odległości choć na stworzenie im http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare ma na swoim blogu http://geekswithblogs.net/BlackRabbitCoder/ napisane o bardzo ładnym szablonu/ram on wykonany, dzięki czemu dużo łatwiej rozwijać (i debugowania) Okna Usługi : C# Toolbox: Debuggable, samoczynnie instalujący szablon usługi Windows (1 z 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

Zapewnia wszystkie podstawowe informacje potrzebne do szybkiego rozpoczęcia pracy. A co najlepsze, daje naprawdę dobry sposób debugowania usługi, tak jakby była to zwykła aplikacja konsolowa. Mógłbym również wspomnieć, że zapewnia on po wyjęciu z pudełka funkcjonalność instalacji (i deinstalacji) twojej usługi. Część druga postu znajduje się pod tym linkiem.

Użyłem tego sam kilka razy i mogę go naprawdę polecić.

3

Możliwe jest skonfigurowanie projektu towarzyszącego do usługi systemu Windows, która działa jako aplikacja konsolowa, ale uzyskuje dostęp do metod usługi za pomocą funkcji Odbicie. Zobacz tutaj po szczegóły i przykład: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/.

Oto odpowiedni kod, który trzeba w aplikacji konsoli:

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

Można też to zrobić: (patrz komentarzy dla wyjaśnienia)

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(); 
    }  
} 
Powiązane problemy