2008-10-17 11 views
50

विजुअल स्टूडियो सेटअप प्रोजेक्ट से इंस्टॉल करने के बाद आप स्वचालित रूप से सेवा कैसे शुरू करते हैं?इंस्टॉल करने के बाद स्वचालित रूप से अपनी सेवा कैसे शुरू करें?

मैंने अभी यह पता लगाया और सोचा कि मैं सामान्य अच्छे के लिए जवाब साझा करूंगा। पालन ​​करने के लिए जवाब। मैं ऐसा करने के अन्य और बेहतर तरीकों के लिए खुला हूं।

+2

मुझे कोई उपयोगी प्रश्न पोस्ट करने में बहुत खुशी है जिसके लिए उन्हें जवाब पता है। कभी-कभी आप जानते हैं कि आपकी नोक का स्वागत होगा। यह भी संभव है कि कोई आपके समाधान के आकर्षक विकल्प के साथ उत्तर देगा। – DOK

+0

यही वही है जो मैं उम्मीद कर रहा हूं। –

+0

ऐसा करना एक स्पष्ट बात है। माइक्रोसॉफ्ट ने अपने कोड से बाहर निकलने वाली चीज़ों को आश्चर्यचकित नहीं किया है। –

उत्तर

54

अपनी परियोजना में निम्न श्रेणी जोड़ें।

using System.ServiceProcess; 

class ServInstaller : ServiceInstaller 
{ 
    protected override void OnCommitted(System.Collections.IDictionary savedState) 
    { 
     ServiceController sc = new ServiceController("YourServiceNameGoesHere"); 
     sc.Start(); 
    } 
} 

सेटअप प्रोजेक्ट कक्षा को उठाएगा और इंस्टॉलर खत्म होने के बाद आपकी सेवा चलाएगा।

+3

सेवा नियंत्रक IDISposable लागू करता है। 'उपयोग' कीवर्ड का उपयोग नहीं कर रहा था या निपटान विधि जानबूझकर बुला रहा था? –

+0

मैं मानता हूं कि सही तरीके से निपटान करना हमेशा अच्छा विचार है। इस उदाहरण में, यह केवल एक बार चलता है। इंस्टॉलेशन प्रोग्राम चलाने के बाद ऑन-कॉमर्ड आग और फिर सेवा किसी अन्य की तरह प्रबंधित की जाती है और स्वचालित रूप से अगले रीबूट पर शुरू होती है। –

+7

आधार के बारे में क्या। COMCommitted (...)। क्या इसे बुलाया जाना चाहिए? –

9

धन्यवाद यह ठीक से चलाने के ...

private System.ServiceProcess.ServiceInstaller serviceInstaller1; 

private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) 
{ 
    ServiceController sc = new ServiceController("YourServiceName"); 
    sc.Start(); 
} 
+1

यह वास्तव में सबसे आसान तरीका है क्योंकि सेवा इंस्टॉलर और आफ्टर इंस्टाल ईवेंट पहले से ही है - नई कक्षा जोड़ने की कोई आवश्यकता नहीं है। –

37

स्वीकार किए जाते हैं जवाब देने के लिए छोटे इसके अलावा:

आप भी इस तरह सेवा का नाम प्राप्त कर सके - किसी भी समस्याओं से बचने यदि सेवा का नाम भविष्य में बदल गई है:

protected override void OnCommitted(System.Collections.IDictionary savedState) 
{ 
    new ServiceController(serviceInstaller1.ServiceName).Start(); 
} 

(हर इंस्टालर एक ServiceProcessInstaller और एक ServiceInstaller है। यहाँ ServiceInstaller serviceInstaller1 कहा जाता है।)

+0

serviceInstaller1 ProjectInstaller का एक निजी सदस्य चर है तो मैं ServInstaller से इसे कैसे एक्सेस कर सकता हूं? – nrjohnstone

7
इसके बजाय अपने स्वयं के वर्ग बनाने की

, परियोजना संस्थापक में सेवा संस्थापक का चयन करें और लागू किए गए घटना के लिए एक ईवेंट हैंडलर जोड़ें:

private void serviceInstallerService1_Committed(object sender, InstallEventArgs e) 
{ 
    var serviceInstaller = sender as ServiceInstaller; 
    // Start the service after it is installed. 
    if (serviceInstaller != null && serviceInstaller.StartType == ServiceStartMode.Automatic) 
    { 
     var serviceController = new ServiceController(serviceInstaller.ServiceName); 
     serviceController.Start(); 
    } 
} 

यह आपकी सेवा ही अगर स्टार्टअप प्रकार स्वचालित पर सेट है शुरू कर देंगे।

+0

जोड़ने के लिए मत भूलना: 'System.ServiceProcess का उपयोग करना; ' – HeWillem

+0

यह वह विकल्प है जो मेरे लिए सबसे अच्छा काम करता है और सबसे सरल और सबसे स्पष्ट लगता है – nrjohnstone

3

उपरोक्त स्निपेट के आधार पर, मेरी ProjectInstaller.cs फ़ाइल FSWServiceMgr.exe नामक सेवा के लिए इस तरह दिख रही है। सेवा स्थापना के बाद शुरू हुई थी। साइड नोट के रूप में, कंपनी को सेट करने के लिए समाधान एक्सप्लोरर में सेटअप प्रोजेक्ट का चयन करते समय प्रॉपर्टी टैब (राइट-क्लिक नहीं) पर क्लिक करना याद रखें।


using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace FSWManager { 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer { 
     public ProjectInstaller() { 
      InitializeComponent(); 
      this.FSWServiceMgr.AfterInstall += FSWServiceMgr_AfterInstall; 
     } 

     static void FSWServiceMgr_AfterInstall(object sender, InstallEventArgs e) { 
      new ServiceController("FSWServiceMgr").Start(); 
     } 
    } 
} 
19

यह दृष्टिकोण इंस्टालर वर्ग और कोड के कम से कम राशि का उपयोग करता है।

using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace MyProject 
{ 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer 
    { 
     public ProjectInstaller() 
     { 
      InitializeComponent(); 
      serviceInstaller1.AfterInstall += (sender, args) => new ServiceController(serviceInstaller1.ServiceName).Start(); 
     } 
    } 
} 

परिभाषित इंस्टालर क्लास डिज़ाइनर में serviceInstaller1 (प्रकार ServiceInstaller) है और यह भी डिजाइनर अपने ServiceName गुण सेट।

संबंधित मुद्दे