27

से विजुअल स्टूडियो से विंडोज़ सेवा प्रोजेक्ट कैसे चलाएं।विजुअल स्टूडियो

मैं विजुअल स्टूडियो 2008 में एक विंडोज सर्विसेज का निर्माण कर रहा हूं, मुझे हमेशा नियंत्रण कक्ष से सेवा चलाने की ज़रूरत है और फिर सेवा के चलते उदाहरण के लिए डीबगर संलग्न करना है। यह बहुत परेशान है क्योंकि मैं बहुत सारे कोड की सफाई कर रहा हूं और विकास के दौरान कई बार अपनी सेवा को पुनरारंभ करने की आवश्यकता है।

मैं अपनी परियोजना को सेटअप करना चाहता हूं ताकि F5 को हिट करने और सेवा चलाने और सीधे डीबग मोड दर्ज करने में सक्षम हो। इसे प्राप्त करने के तरीके पर कुछ सुझाव बहुत अच्छे होंगे।

अग्रिम धन्यवाद !!!

+0

इस लेख http देखो:

यहाँ प्रासंगिक कोड है कि आप कंसोल आवेदन में की आवश्यकता होगी है//msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx। यह निम्नलिखित लेखों को भी संदर्भित करता है: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

उत्तर

6

Debugger.IsAttached के लिए नियमित जांच में और यदि यह सच है तो यह ऐप शुरू होता है जैसे कि यह एक कंसोल है, यदि नहीं, तो ServiceBase.Run() पर कॉल करें।

2

एक अलग परियोजना बनाएं जो केवल सेवा प्रोजेक्ट का संदर्भ देती है और तत्काल सेवा शुरू करती है। यह सिर्फ एक सामान्य ऐप की तरह चलता है और आप इसमें कदम उठा सकते हैं।

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

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

यह आपको विजुअल स्टूडियो के भीतर से चलाने की अनुमति दे सकता है।

एक और तरीका System.Diagnostics.Debugger.Break() पर कॉल करके अपने कोड में एक प्रोग्रामेटिक ब्रेकपॉइंट एम्बेड करना होगा। जब आप इसे कहते हैं, तो कहें, ऑनस्टार्ट() आपकी सेवा का कॉलबैक और सेवा कंसोल से अपनी सेवा शुरू करें, प्रोग्रामेटिक ब्रेकपॉइंट एक संवाद बॉक्स ट्रिगर करेगा जो आपको विजुअल स्टूडियो के मौजूदा उदाहरण से जुड़ने या एक नया शुरू करने की अनुमति देता है उदाहरण। यह वास्तव में वह तंत्र है जिसका उपयोग मैं अपनी सेवा को डीबग करने के लिए करता हूं।

+3

उस लिंक के निर्देश पूरी तरह से मेरे लिए काम करते हैं। धन्यवाद! –

+0

विंडोज 8 में बस एफवाईआई, ऐसा लगता है कि उन्होंने विंडोज सेवाओं में कुछ बदलाव किए हैं और इंटरैक्टिव चीजों को करने की उनकी क्षमता पर बहुत पीछे कटौती की है। डीबगर। लॉन्च() और डीबगर। ब्रेक() अब जीयूआई संवाद को ट्रिगर नहीं कर रहा है, जिसने आपको डीबग करने के लिए चुनने और आईडीई की अनुमति दी है ताकि सेवा बस लटक सके। FYI करें –

2

बस

सेवा निर्माता से onStart() घटना फोन मैं निम्नलिखित तरीके

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

आप एक खोल के रूप में अपने विंडोज़ सेवा करना चाहते हैं में यह किया है, वहाँ में थोड़ा कोड होना चाहिए वहां आपको इसका परीक्षण करने की ज़रूरत नहीं है।

आपके पास कक्षा में ऐसा करने की हर चीज होनी चाहिए।

आप यूनिट का परीक्षण कर सकते हैं और यदि यह काम करता है तो इसे अपनी सेवा के लिए संदर्भित करें।

इस तरह जब आप कक्षा में अपनी हर चीज कर रहे होते हैं तो जब आपकी सेवा पर लागू होता है तो हर चीज को काम करना चाहिए। :)

क्या कोई ईवेंट लॉग आप देख सकते हैं कि यह चल रहा है कि आपकी सेवा क्या कर रही है, परीक्षण करने का एक अच्छा तरीका भी है: डी कोशिश करें।

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

ये लिंक सेवाओं के साथ काम करते समय बहुत उपयोगी हो सकते हैं।

इस बनाने के लिए उन्हें http://msdn.microsoft.com/en-us/library/zt39148a.aspx

जेम्स माइकल हरे अपने ब्लॉग पर किया है http://geekswithblogs.net/BlackRabbitCoder/ वास्तव में एक अच्छा टेम्पलेट/ढांचा उनके द्वारा की गई के बारे में लिखा है, यह बहुत आसान विकसित करने के लिए (और डिबग) बनाने पर हालांकि एक पैदल दूरी पर है विंडोज सेवाएं : सी # टूलबॉक्स: एक डिबग्रेबल, सेल्फ-इंस्टालिंग विंडोज सर्विस टेम्पलेट (2 में से 1) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

यह आपको उन सभी मूलभूत बातें प्रदान करता है जिन्हें आपको जल्दी से शुरू करने की आवश्यकता है। और सबसे अच्छा, यह आपको अपनी सेवा को डीबग करने का एक अच्छा तरीका देता है जैसे कि यह नियमित कंसोल एप्लिकेशन था। मैं यह भी उल्लेख कर सकता हूं कि यह आपकी सेवा को स्थापित करने (और अनइंस्टॉल) करने के लिए बॉक्स कार्यक्षमता से बाहर प्रदान करता है। इस लिंक पर भाग दो भाग मिल सकते हैं।

मैंने इसे स्वयं दो बार उपयोग किया है, और वास्तव में इसकी अनुशंसा कर सकते हैं।

3

विंडोज सेवा में एक सहयोगी प्रोजेक्ट स्थापित करना संभव है जो कंसोल ऐप के रूप में चलता है, लेकिन प्रतिबिंब का उपयोग करके सेवा विधियों तक पहुंचता है। विवरण और उदाहरण के लिए यहां देखें: 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

तुम भी ऐसा कर सकते हैं: (विवरण के लिए टिप्पणियां देखें)

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(); 
    }  
} 
संबंधित मुद्दे