27

Görsel stüdyodan bir Windows hizmeti projesi nasıl çalıştırılır.Visual Studio'dan Windows hizmetini çalıştırma (F5)

Görsel stüdyo 2008'de bir pencere programı yapıyorum, her zaman hizmeti kontrol panelinden çalıştırmalı ve ardından hata ayıklayıcısını hizmetin çalışan örneğine iliştirmeliyim. Bir çok kodu temizlediğimden ve bu yüzden geliştirme sırasında servisimi tekrar başlatmam gerektiğinden dolayı rahatsız edici.

Projemi, F5'i vurabilmek ve hizmeti çalıştırmak ve doğrudan hata ayıklama moduna girmek için kurmak istiyorum. Bunu nasıl başaracağınıza dair bazı ipuçları harika olurdu.

Şimdiden teşekkürler!

+0

bu makale http Bak (açıklama için yorumları görün): Burada

konsol uygulamasında gerekir alakalı koddur//msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. Ayrıca, aşağıdaki makalelere başvurur: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

cevap

6

Main() rutininizde Debugger.IsAttached numaralı telefona bakın ve eğer doğruysa uygulamanızı bir konsol gibi başlatıyorsa, ServiceBase.Run() numaralı telefona arayın.

2

Hizmet projesine başvuran ve hizmeti başlatan ve başlatan ayrı bir proje oluşturun. Sadece normal bir uygulama gibi çalışır ve içine adım atabilirsiniz.

YourService s = new YourService(); 
s.Start(); 
25
here'dan kopyalanmıştır.

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

Bu Visual Studio içinde çalıştırmak izin vermelidir. System.Diagnostics.Debugger.Break()

System.Diagnostics.Debugger.Break() numaralı telefonu arayarak kodunuzda programlı bir kesme noktası yerleştirmenin bir başka yolu da olabilir. Bunu, hizmetinizin OnStart() geri çağırma işlemini gerçekleştirdiğinizde ve hizmet konsolundan Hizmetler konsolundan başladığınızda, programa dayalı kesme, Visual Studio'nun varolan bir örneğine iliştirmenize veya yeni bir klasöre başlamanıza olanak veren bir iletişim kutusunu tetikler. örneği. Bu aslında hizmetimi hata ayıklamak için kullandığım mekanizma.

+3

Bu bağlantıdaki talimatlar benim için mükemmel çalışıyor. Teşekkürler! –

+0

Sadece FYI, Windows 8'de, windows servislerinde bazı değişiklikler yaptıkları ve etkileşimli şeyler yapma becerilerini çok azalttıkları görülüyor. Debugger.Launch() ve Debugger.Break() artık, GUI Dialog'u seçmenize izin vermeyecek ve IDE'nin hata ayıklamasını yaparak hizmetin askıya alınmasına neden oluyor. Bilginize –

2

Sadece hizmet kurucusundan

OnStart() olayı çağırır ben çok az kod olmalıdır,

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

Bir kabuk olarak windows hizmeti istiyorum şu şekilde yaptı Orada test etmek zorunda değilsiniz.

Hizmetinizin bir derste yapmasını istediğiniz her şeye sahip olmalısınız.

Sizi sınıfta test edebilir ve çalışıyorsa, hizmetinize göre referans alabilirsiniz.

Böylelikle, istediğiniz her şeyi yaparken sınıfınız olduğunda, o zaman sizin hizmetinize uygulandığında, her şey çalışmalıdır. :)

Bir olay günlüğü, çalışırken ne yaptığını görebileceğiniz bir etkinlik günlüğü, ayrıca test etmenin güzel bir yolu olacak: D bunu deneyin.

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

Bu bağlantılar hizmetler ile çalışırken çok yararlı olabilir.

Bu yürüyüşe, Windows Servisleri o çok daha kolay geliştirmek (ve hata ayıklama) için yapım onları http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare blog'unda http://geekswithblogs.net/BlackRabbitCoder/ o yapmış gerçekten güzel bir şablon/çerçeve hakkında yazmıştır oluşturma olsa : C# Araç Kutusu: Bir Hata Ayıklama, Kendiliğinden Yüklenen Windows Hizmeti Şablonu (1 of 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

Hızlı başlangıç ​​için gereken tüm temel bilgileri sağlar. Ve hepsinden önemlisi, hizmetinizi düzenli bir konsol uygulaması gibi ayıklamanın gerçekten güzel bir yoludur. Ayrıca, hizmetinizi yüklemek ve kaldırmak için kutu işlevinden de yararlanabileceğinden bahsedebilirim. Yayının ikinci kısmı bu linkte bulunabilir.

Bunu kendim birkaç kez kullandım ve gerçekten tavsiye edebilirim.

3

Konsol uygulaması olarak çalışan Windows Hizmetine bir tamamlayıcı proje kurmak ancak Yansıma'yı kullanarak hizmet yöntemlerine erişmek mümkündür. Detaylar ve bir örnek için buraya bakınız: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/. Ayrıca yapabilirsiniz

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(); 
    }  
} 
İlgili konular