इंस्टॉलर खत्म होने पर स्वचालित रूप से एक सेवा शुरू करना

संभावित डुप्लिकेट:
   इंस्टॉल करने के बाद स्वचालित रूप से अपनी सेवा कैसे शुरू करें?

मेरे पास एक विजुअल स्टूडियो 2008 सी # .NET 3.5 सेवा इंस्टॉलर प्रोजेक्ट (एमएसआई) है जो विंडोज 7 x64 पर चल रहा है।

इंस्टॉलेशन खत्म होने पर मेरी सेवा शुरू करने के लिए मैं ServiceInstaller.OnAfterInstall अधिसूचना की सदस्यता लेता हूं।

[RunInstaller(true)]
public partial class MyInstaller : Installer
{
    private System.ServiceProcess.ServiceInstaller my_installer_;

    private void InitializeComponent()
    {
       //...
        this.my_installer_.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.OnAfterInstall);
       //...
    }

    private void OnAfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController svc =
            new System.ServiceProcess.ServiceController("MyService"))
        {
            svc.Start();//completes successfully
        }
    }
}

हालांकि समारोह अपवाद के बिना सफल होता है, लेकिन इंस्टॉलर खत्म होने पर मेरी सेवा कभी नहीं चलती है।

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

इंस्टॉलर प्रक्रिया समाप्त होने पर मुझे अपनी सेवा स्वचालित रूप से प्रारंभ करने के लिए क्या करने की आवश्यकता है?

1
ऐसा लगता है कि आपने जो किया है वह काम करना चाहिए। इसे डीबग करने के लिए संभावित चाल: 30 सेकंड या उससे अधिक के मूल्य के साथ थ्रेड। सो डालने का प्रयास करें। यह आपको सेवा प्रक्रिया में डीबगर संलग्न करने की अनुमति दे सकता है, और आप Thread.Sleep के ठीक बाद ब्रेक पॉइंट सेट कर सकते हैं। एक बार जब आप डीबगर में रुक जाते हैं, यदि आपको अभी भी फिर से शुरू करने में त्रुटियां मिलती हैं, तो यह एक समय की बात नहीं है। उस समय आप अपने अवकाश पर अपनी सेवा स्थिति से पूछ सकते हैं और यह निर्धारित कर सकते हैं कि उस चरण के बारे में समस्या क्या हो रही है। यदि Thread.Sleep इसे काम करना शुरू कर देता है, तो निश्चित रूप से यह एक समय की बात है ...
जोड़ा लेखक Merlyn Morgan-Graham, स्रोत
आप "System.Diagnostics.Debugger.Launch ();" भी जोड़ सकते हैं डीबगर को संलग्न करने के लिए मजबूर करने के लिए अपनी प्रारंभ विधि की शुरुआत में, ताकि आप यह जांच सकें कि क्या गलत हो रहा है। यह संभव है कि कहीं अपवाद हो और आपकी सेवा स्वचालित रूप से बंद हो जाती है।
जोड़ा लेखक user276648, स्रोत

2 उत्तर

AfterInstall ईवेंट का उपयोग करना

अपनी सेवा इंस्टॉलर कक्षा में AfterInstall ईवेंट बनाएं और ServiceController का उपयोग करके सेवा प्रारंभ करें।

public ServiceInstaller()
{
    InitializeComponent();
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

प्रतिबद्ध घटना का उपयोग करना

public ServiceInstaller()
{
    InitializeComponent();
    this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
}

void ProjectInstaller_Committed(object sender, InstallEventArgs e)
{
    ServiceController sc = new ServiceController(serviceInstaller1.ServiceName);
    sc.Start();
}

Or you can override OnCommitted event

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

उपर्युक्त के अलावा कृपया निम्नलिखित जांचें

  • इंस्टॉलर प्रारंभ प्रकार: स्वचालित
  • खाता: स्थानीय सिस्टम

सेवा इंस्टॉलर के अलावा आपको सेटअप प्रोजेक्ट की आवश्यकता होती है जो उपरोक्त सेवा इंस्टॉलर के प्राथमिक आउटपुट देकर बनाई गई है।

enter image description here

सेटअप में सेवा इंस्टॉलर प्रोजेक्ट आउटपुट देकर कम से कम इंस्टॉल पर कस्टम एक्शन बनाएं।

enter image description here

यहां । उम्मीद है कि यह आपकी मदद करेगा।

1
जोड़ा
क्या मैंने ऐसा नहीं किया है?
जोड़ा लेखक PaulH, स्रोत
@PaulH कृपया मेरा अद्यतन उत्तर देखें। यह उपरोक्त सेटिंग्स के साथ मेरे लिए ठीक काम कर रहा है।
जोड़ा लेखक Damith, स्रोत

I assume that Start returns immediatly, and Starts the Service in the background. Check the Docs: http://msdn.microsoft.com/en-us/library/yb9w7ytd.aspx

0
जोड़ा
हाँ, मुझे यकीन है कि यह करता है। यह स्पष्ट नहीं करता है कि सेवा क्यों शुरू नहीं हुई है या इसे सही तरीके से कैसे शुरू किया जाए।
जोड़ा लेखक PaulH, स्रोत
प्रतीक्षा ने इस मुद्दे को ठीक नहीं किया - इंस्टॉलर उस प्रतीक्षा पर लटका दिया। सेवा शुरू करने और असफल होने का प्रयास करेगी। मेरे पास base.Install (savedState) था; मेरे इंस्टॉलर के ऊपर। इंस्टॉल करें ओवरराइड करें। इसलिए, इंस्टॉलर सभी निर्भरताओं को स्थापित करने से पहले सेवा शुरू करने का प्रयास कर रहा था। बेस ओवर को मेरे ओवरराइड के नीचे ले जाकर, मैंने समस्या तय की। मैंने जो कुछ पोस्ट किया है उससे कोई भी नहीं देखा होगा, इसलिए आपको अंक मिलते हैं क्योंकि आप मुझे समाधान में ले जाते हैं।
जोड़ा लेखक PaulH, स्रोत
क्या आपने इसे शुरू होने तक प्रतीक्षा करने की कोशिश की है? मेरे द्वारा पोस्ट किए गए लिंक में एक उदाहरण है
जोड़ा लेखक Andreas, स्रोत