2010-08-08 15 views
13

मैं एक खिड़कियों सेवा मिल गया है, सी # का उपयोग कर बनाया गया है, कि एक VS2008 सेटअप परियोजना के माध्यम से स्थापित किया गया है, और स्थापना रद्द प्रक्रिया के साथ होने वाली समस्याओं की एक जोड़ी हो रहा है:विंडोज सेवा को अनइंस्टॉल करने का सही तरीका?

सेवा तब भी नहीं रूकती

की स्थापना रद्द करने से पहले

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

(वर्तमान में, मुझे इसे एससी का उपयोग कर मैन्युअल रूप से हटाने का सहारा लेना है servicename)।

मैं निम्नलिखित कोड का उपयोग कर की स्थापना रद्द करने से पहले सेवा बंद करने के लिए कोशिश कर रहा हूँ, लेकिन यह प्रभाव लेने जा प्रतीत नहीं होता:

protected override void OnBeforeUninstall(IDictionary savedState) 
{ 
    base.OnBeforeUninstall(savedState); 
    ServiceController serviceController = new ServiceController(MyInstaller.ServiceName); 
    serviceController.Stop(); 
} 

जब यह कोड कहा जाता है, और कैसे मैं सेवा बंद कर सकते अनइंस्टॉल करने से पहले?

स्थापना फ़ोल्डर की स्थापना रद्द करने

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

क्या स्थापना फ़ोल्डर को हटाने के लिए अनइंस्टॉल प्रक्रिया के लिए संभव है, जिसमें उस फ़ोल्डर के भीतर सभी जेनरेट की गई फ़ाइलें शामिल हैं, और यदि ऐसा है, तो कैसे?

धन्यवाद।

उत्तर

6

किसी को भी इन समस्याओं का जवाब की तलाश में के लाभ के लिए:

सेवा तब भी नहीं रूकती पहले

की स्थापना रद्द करने के लिए अभी तक इस के लिए एक समाधान नहीं मिली है।

स्थापना फ़ोल्डर

परियोजना संस्थापक में OnAfterUninstall विधि अधिरोहित किए जाने की आवश्यकता की स्थापना रद्द करने के बाद हटाया नहीं, और किसी भी बनाई गई फ़ाइलों से हटाना होगा। यदि एप्लिकेशन में इस चरण के बाद कोई फ़ाइल नहीं है तो एप्लिकेशन इंस्टॉलर फ़ोल्डर स्वचालित रूप से हटा दिया जाता है।

protected override void OnAfterUninstall(IDictionary savedState) 
{ 
    base.OnAfterUninstall(savedState); 

    string targetDir = Context.Parameters["TargetDir"]; // Must be passed in as a parameter 

    if (targetDir.EndsWith("|")) 
     targetDir = targetDir.Substring(0, targetDir.Length-1); 

    if (!targetDir.EndsWith("\\")) 
     targetDir += "\\"; 

    if (!Directory.Exists(targetDir)) 
    { 
     Debug.WriteLine("Target dir does not exist: " + targetDir); 
     return; 
    } 

    string[] files = new[] { "File1.txt", "File2.tmp", "File3.doc" }; 
    string[] dirs = new[] { "Logs", "Temp" }; 

    foreach (string f in files) 
    { 
     string path = Path.Combine(targetDir, f); 

     if (File.Exists(path)) 
      File.Delete(path); 
    } 

    foreach (string d in dirs) 
    { 
     string path = Path.Combine(targetDir, d); 

     if (Directory.Exists(d)) 
      Directory.Delete(d, true); 
    } 

    // At this point, all generated files and directories must be deleted. 
    // The installation folder will be removed automatically. 
} 

याद रखें, स्थापना फ़ोल्डर एक पैरामीटर के रूप में पारित किया जाना चाहिए:

  • ठीक है, अपने सेटअप परियोजना पर क्लिक करें, फिर देखें चुनें -> कस्टम क्रिया
  • कस्टम कार्यों में खुलेगा अपने मुख्य खिड़की। अनइंस्टॉल नोड के तहत "XXX से प्राथमिक आउटपुट" पर राइट क्लिक करें और "प्रॉपर्टी विंडो"
  • प्रॉपर्टी विंडो में, कस्टमएक्शनडेटा के अंतर्गत, निम्न दर्ज करें: /TargetDir = "[TARGETDIR] |" (अंत में पाइप नोट करें, इसे हटाएं नहीं)।

यह स्थापना फ़ोल्डर को आपके अनइंस्टॉल दिनचर्या के पैरामीटर के रूप में पास करेगा ताकि आप जान सकें कि एप्लिकेशन कहां स्थापित किया गया था और आपकी जेनरेट की गई फाइलें और फ़ोल्डर्स को हटा सकता है।

+1

मुझे अपने पहले मुद्दे का जवाब देना है। यदि आप इसे कभी समझते हैं तो कृपया इसे पोस्ट करें। – PaulH

+0

@ म्यून मैंने जोड़ा [यह कोड] (http://www.primordialcode.com/blog/post/msi-simple-delete-files- कस्टम-action) 'OnAfterUninstall' विधि पर, लेकिन यह कहता है कि फ़ाइल हो रही है किसी अन्य प्रक्रिया या उपयोग से इनकार किया जाता है –

1

अधिकतर संभावना है कि सेवा को बंद करने में थोड़ा समय लगेगा, और सेवा पूरी तरह से बंद होने से पहले आप जारी रह रहे हैं। WaitForStatus(ServiceControllerStatus) विधि को कॉल करने का प्रयास करें।

यह आपके कोड को "रोक" संदेश को संसाधित करने तक प्रतीक्षा करेगा, और बंद हो जाएगा। एक बार सेवा वास्तव में बंद हो जाने के बाद, यह अब किसी भी फ़ाइल हैंडल पर नहीं रखेगी।

+1

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

+0

आह, ठीक है। एक अलग सवाल, जब आप "एप्लिकेशन द्वारा बनाई गई फाइलें" कहते हैं, तो आपका मतलब है कि जब इंस्टॉलर इंस्टॉलेशन पूरा करता है, तो अनुप्रयोगों को चलाने के बजाए फाइलें मौजूद नहीं होतीं? उन फ़ाइलों को मैन्युअल रूप से साफ़ करने की आवश्यकता हो सकती है (बाद में इंस्टॉल करें?) ... कई इंस्टॉलर "स्वचालित रूप से" हटाए जाने के बारे में बहुत सावधान रहेंगे। –

+1

हां, मैंने स्थापना निर्देशिका में कस्टम पैरामीटर के रूप में गुज़रने और एप्लिकेशन द्वारा बनाई गई फ़ाइलों को हटाने के लिए OnAfterUninstall विधि को ओवरराइड करके उस समस्या को हल करने में कामयाब रहे। यदि फ़ोल्डर उसके बाद खाली है, तो इंस्टॉलर स्वचालित रूप से इसे हटा देता है। – Mun

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