2011-10-23 10 views
5

के दौरान एप्लिकेशन को पुनरारंभ करने में विफल रहता है मैं C#, .NET 4, WIX 3.5, Windows Vista का उपयोग कर रहा हूं। मैंने अपने एप्लिकेशन को RestAMicationRestart विधि को p/invoking करके और WM_QUERYENDSESSION और WM_ENDSESSION विंडो संदेशों को संभालने के द्वारा RestartManager के साथ संगत किया है (मैं new IntPtr(1); लौटाता हूं)। अनुप्रयोग लाँचRestartManager अद्यतन

  1. ;:

    अगर मैं मैन्युअल रूप से अपने आवेदन अद्यतन करने के लिए प्रयास करते हैं, तो सब कुछ एकदम सही ढंग से काम करता है

  2. नए ऐप संस्करण वाले एमएसआई फ़ाइल लॉन्च करें;
  3. स्थापना/अद्यतन के दौरान, मुझे चल रहे एप्लिकेशन को बंद करने के लिए कहा जाता है;
  4. चल रहे ऐप को जारी रखने पर, पूर्ण इंस्टॉल करें, और ऐप पुनरारंभ किया गया है;

अगर मैं आवेदन से ही अपने आवेदन अद्यतन करने के लिए प्रयास करते हैं, तो मैं समस्याएं आ:

1) लॉन्च आवेदन;
2) नई एमएसआई फ़ाइल डाउनलोड करें; साथ
3) लॉन्च MSI फ़ाइल:

using (System.Diagnostics.Process p = new System.Diagnostics.Process()) 
    { 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = "msiexec"; 
     p.StartInfo.Arguments = "/i \"" + downloadPath + "\" /passive"; 
     p.StartInfo.UserName = "Administrator"; 
     p.StartInfo.Password = securePassword; 
     p.Start(); 
    } 

4) क्योंकि मैं निष्क्रिय मोड का उपयोग कर रहा हूँ, आवेदन स्वचालित रूप से बंद कर दिया है;
5) स्थापना के बाद, मेरा एप्लिकेशन पुनरारंभ नहीं किया गया है और इवेंट व्यूअर के तहत मेरे पास
इवेंट 10007 - एप्लिकेशन या सेवा 'MyApp' को पुनरारंभ नहीं किया जा सका।

मैं कोशिश की है:

  1. नहीं msiexec के लिए निष्क्रिय मोड का उपयोग करने के लिए;
  2. cmd.exe (cmd.exe/c "msiexec/i ....") के माध्यम से msiexec लॉन्च करें - उम्मीद है कि किसी अन्य प्रक्रिया से msiexec लॉन्च करने से समस्या हल हो जाएगी; MSI अद्यतन शुरू करने से पहले 60 + सेकंड के लिए
  3. प्रतीक्षा (मेरे परिदृश्य में प्रासंगिक नहीं होना चाहिए, लेकिन MSDN प्रलेखीकरण इसके बारे में कुछ है ...)

लेकिन इनमे से कोई भी काम किया है (हमेशा एक ही परिणाम)।

उन्नत अनुमतियों के साथ सेटअप लॉन्च करने के लिए समस्या के साथ कुछ करना पड़ सकता है, क्योंकि मैन्युअल अपडेट के दौरान मुझे इवेंट व्यूअर में एक चेतावनी मिलती है - एप्लिकेशन MyApp (पिड 3220) को पुनरारंभ नहीं किया जा सकता है - एप्लिकेशन एसआईडी नहीं है मैच कंडक्टर एसआईडी
इसके बावजूद, ऐप को पुनरारंभ करना अभी भी काम करता है। चेतावनी को Google करना कोई अच्छा/विशिष्ट परिणाम नहीं देता है, केवल यह चेतावनी संभवतः एमआईएस को एक उन्नत प्रॉम्प्ट में चलाने के कारण होती है।

मैं इस समस्या को कैसे ठीक कर सकता हूं (या कामकाज), ताकि मैं अपने आवेदन को एप्लिकेशन से अपडेट कर सकूं और बाद में अपना आवेदन पुनरारंभ कर सकूं?

संपादित करें - अतिरिक्त परीक्षण:

  1. , WM_QUERYENDSESSION और WM_ENDSESSION संदेशों का जवाब देने की जरूरत होने के लिए वहाँ नहीं लगता है क्योंकि एक मैनुअल अपग्रेड के दौरान आवेदन पुनः आरंभ करने के लिए उन्हें बिना काम करता है, इसलिए हम पर राज कर सकते हैं उन्हें बाहर;
  2. यदि मैं अपग्रेड किए गए एप्लिकेशन को व्यवस्थापक प्रमाण-पत्र प्रदान नहीं करता हूं और इसके बजाय मैं उन्हें अपग्रेड के दौरान टाइप करता हूं, फिर ऐप पुनरारंभ करने के काम करता है;
  3. यदि मैं एक उन्नत कमांड प्रॉम्प्ट चलाता हूं और वहां से मैन्युअल रूप से एप्लिकेशन अपग्रेड शुरू करता हूं, तो ऐप पुनरारंभ करना अभी भी काम करता है;
  4. मानक उपयोगकर्ता खातों के तहत काम पर अपग्रेड करने के लिए (अब तक मैंने यूएसी के साथ एक प्रशासक खाते के तहत परीक्षण किया है), तो मुझे p.StartInfo.LoadUserProfile = true; भी सेट करना होगा। अन्यथा कुछ भी नहीं होता है। (एप्लिकेशन पुनरारंभ अभी भी काम नहीं करता है);
  5. मैंने अन्य सभी प्रक्रिया स्टार्टइन्फो पैरामीटर की कोशिश की जो मैं सेट कर सकता था - वर्किंग डायरेक्टरी, रीडायरेक्ट, वर्ब
    (= "रनस") - परिणामों में कोई बदलाव नहीं;
  6. मैंने वर्चुअल मशीन पर Vista SP2 स्थापित किया है जिसे मैं परीक्षण कर रहा हूं (अब तक SP1 चलाया गया है), लेकिन कोई बदलाव नहीं;
  7. मैंने वर्बोज़ लॉगिंग के साथ "स्वचालित" एप्लिकेशन अपग्रेड किया। अंत में एक त्रुटि संदेश था - रीस्टार्ट प्रबंधक: अनुप्रयोगों को पुनरारंभ करते समय विफल। त्रुटि: 352। यह त्रुटि कोड बहुत सामान्य है (http://msdn.microsoft.com/cs-cz/library/aa373665), अधिक विस्तृत जानकारी प्राप्त करने के लिए मुझे अपना खुद का इंस्टॉलर लिखना होगा जो त्रुटि के बाद RmGetList पर कॉल करेगा, तो मुझे अधिक जानकारी मिल सकती है (हालांकि यह कुछ है जो मैं तैयार नहीं हूं करने के लिए);

संपादित करें 2 - MSI लॉग फ़ाइल:
http://mommi.planet.ee/muu/log.txt

+0

आप सीधे MSI एपीआई का उपयोग करने की कोशिश की है [ 'MsiInstallProduct'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315.aspx)? दुर्भाग्य से, मैं नेट वातावरण में अपने समकक्ष को नहीं जानता। –

+0

मैंने पहले एमएसआई एपीआई की कोशिश नहीं की है, लेकिन मैंने इसे जाने दिया।दो समस्याएं - 1) वह एपीआई RestartManager का समर्थन नहीं करती है (यह मुझे कंप्यूटर को रीबूट करने के लिए कहती है); 2) प्रशासक विशेषाधिकारों (मेरे परिदृश्य में एक जरूरी) में पास करने का कोई तरीका प्रतीत नहीं होता है। – Marko

+0

क्या आप कृपया एमएसआई स्थापना का लॉगफाइल प्रदान कर सकते हैं। आप पैरामीटर "/ l * v% temp% \ mylog.log" जोड़कर msiexec से इसे प्राप्त कर सकते हैं। जो हमें – weberik

उत्तर

0

यह मानते हुए कि मैन्युअल प्रक्रिया वास्तव में किसी भी समस्या ऐसा लगता है कि "खुद को अद्यतन करने" के साथ संयोजन में व्यवस्थापक विशेषाधिकार के लिए अपनी जरूरत की ओर जाता है बिना काम करता है ये समस्याएं। मैं निम्नलिखित विकल्पों देखें:

  • अद्यतन निष्पादित करने के लिए एक बैच फ़ाइल बनाने
    के लिए आपको यह बैच फ़ाइल (ऊंचा विशेषाधिकारों के साथ) कहते हैं, कर चाहते हैं कि एप्लिकेशन को बंद ... बैच फ़ाइल चाहिए कुछ सेकंड प्रतीक्षा करें, फिर जांचें कि ऐप अभी भी चल रहा है (और इसे मामले में बंद करें) और फिर msiexec चलाने के लिए आपको जिस कमांडलाइन को चलाने की आवश्यकता है उसे चलाएं - ऐप को msiexec के भीतर से पुनरारंभ न करें, लेकिन बैच फ़ाइल से msiexec के सफल रन के बाद ।

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

+1

मुझे लगता है कि मेरे परिदृश्य में एक अद्यतन करने के लिए एक अलग बैच फ़ाइल या निष्पादन योग्य इनऑर्डर बनाने के बारे में आपका अधिकार है। मुझे लगता है कि यह विंडोज़ में कुछ सीमा/बग के कारण है। एक चीज जो मैं जोड़ूंगा, ऐप को वर्तमान उपयोगकर्ता विशेषाधिकारों (गैर-व्यवस्थापक) के साथ पुनरारंभ करने के लिए, फिर आपको दो फाइलों की आवश्यकता होगी। मुख्य ऐप पहले कॉल करेगा जो दूसरे को व्यवस्थापक अधिकारों के साथ कॉल करेगा (जो msiexec को कॉल करता है), बाद में पहला मुख्य एप्लिकेशन शुरू करेगा। क्योंकि पहले निष्पादन योग्य को वर्तमान उपयोगकर्ता विशेषाधिकारों के साथ बुलाया जाता है क्योंकि ऐप को वर्तमान उपयोगकर्ता अधिकारों के साथ भी शुरू किया जाता है ... – Marko