2009-12-16 13 views
7

के साथ संस्करण संख्या के बावजूद फ़ाइल इंस्टॉल करें MyApp संस्करण 1.0 में फ़ाइल foo.dll शामिल है। इस फ़ाइल का संस्करण संस्करण 10.5.567 था। अब MyApp संस्करण 2.0 है और foo.dll का संस्करण 2.0.123 है। संस्करण पुराने संस्करण की तुलना में कम है। इस डीएलएल को लिखने वाले विक्रेता ने फ़ाइल संस्करण संख्या के साथ पीछे जाने का फैसला किया। यह कोई निर्णय नहीं है जिसे मैं बदल सकता हूं।वाईएक्स

मैं हमेशा इस फ़ाइल को स्थापित करने के लिए वाईएक्स कैसे प्राप्त करूं?

RemoveExistingProducts कार्रवाई को InstallFinalize कार्रवाई के बाद निर्धारित किया गया है और इसे भी बदला नहीं जा सकता है।

इंस्टॉलशील्ड में 'हमेशा ओवरराइट' ध्वज था लेकिन मुझे नहीं लगता कि मैं संकलक स्विच के माध्यम से सभी फ़ाइलों के व्यवहार को बदले बिना इसकी नकल कर सकता हूं। मुझे यह नहीं चाहिए। मैं सिर्फ यह एक फ़ाइल अद्यतन करना चाहता हूँ।

मैं भी

<RemoveFile Id="foo.dll" On="install" Name="foo.dll" /> 

की कोशिश की है लेकिन यह या तो काम नहीं किया। मैं अंत में 'त्रुटि 2753 फ़ाइल foo.dll को संस्थापन के लिए चिह्नित नहीं किया गया' प्राप्त कर रहा हूं।

उत्तर

3

यह आसान नहीं है क्योंकि यह एमएसआई-पैकेज के मानक व्यवहार के खिलाफ है। संकलन करते समय, आपको light.exe में -sf के साथ supress-file-options सेट करना होगा। फिर आपकी फाइलों से कोई फ़ाइल-सूचनाएं नहीं पढ़ी जाती हैं। आप डिफॉल्ट वर्जन सेट कर सकते हैं इस संस्करण का उपयोग किया जाएगा। मैंने समाधान में RemoveFile भी उपयोग किया है, लेकिन मैं कह सकता हूं कि यह काम करता है। मैंने इसे उसी घटक में जोड़ा है जहां मैं फ़ाइल जोड़ता हूं।

<Component> 
     <File DiskId="1" Id="fooDLL" Name="foo.dll" Vital="yes" 
     DefaultVersion="$(var.MAJORVERSION).$(var.MINORVERSION).$(var.BUILDVERSION)" 
     DefaultLanguage="0"></File> 
     <RemoveFile Id='RemoveOldDLL' On='install' Name='foo.dll'/> 
    </Componente> 

यह एक साफ तरीका नहीं है, लेकिन पुराने संस्करण को हटाने के लिए यह मेरे लिए काम करता है।

+0

हैवेन्ट ने यह कोशिश की, लेकिन संभव लग रहा है। विभिन्न दृष्टिकोणों की सूची के लिंक के लिए इस धागे में मेरा जवाब देखें। –

+0

मैंने एक एमडीई फ़ाइल स्थापित करने के लिए DefaultVersion का उपयोग करने का प्रयास किया और जब मैंने पैच स्थापित किया, तो यह ठीक काम करता था, फ़ाइल सही ढंग से ओवरराइट की गई थी। एकमात्र समस्या यह थी कि पैच अनइंस्टॉल नहीं करेगा। इंस्टॉल लॉग ने कहा "नई फ़ाइल संस्करण - मौजूदा फ़ाइल को विचलित", और मूल मीडिया के लिए अनइंस्टॉल कहा जाता है। मैंने अभी भी इसे हल नहीं किया है इसलिए किसी भी सुझाव का स्वागत किया जाएगा। – Dave

1

मैं एक ऐसी ही सवाल एक समय पहले उत्तर दिया: Forcing an upgrade of a file that is modified during its initial installation

मुझे लगता है कि मैं एक साथी फ़ाइल का उपयोग इस समस्या को हल करने के लिए होता है, लेकिन जब से सवाल में फ़ाइल एक dll है यदि आप सत्यापन त्रुटियों मिल सकता है और इसलिए एक माना निष्पादन योग्य। मेरा मानना ​​है कि यह अभी भी काम करेगा, और भरोसेमंद।

-1

एक चीज जो कोशिश करने लायक हो सकती है वह अनुक्रम में जल्दी से RemoveExistingProducts सेट करना है। एमएसआई को पहले पुराने प्रोग्राम को हटा देना चाहिए, फिर अपग्रेड इंस्टॉल करें। यह आपकी समस्या का समाधान करेगा। जैसे

<InstallExecuteSequence> 
    <RemoveExistingProducts After="CostFinalize" /> 
</InstallExecuteSequence> 
+0

अफसोस की बात है, इसे * लागत से पहले * होना चाहिए (क्योंकि CostFinalize वह चरण है जहां एमएसआई मूल्यांकन करता है कि कौन सी फाइलें अपडेट हो सकती हैं) - और जहां तक ​​मैं कह सकता हूं, RemoveExistingProducts को अनुक्रमित करने की अनुमति नहीं है। अगर आपको इसके चारों ओर एक रास्ता मिल जाए, तो मुझे इसके बारे में सुनना अच्छा लगेगा। :) – jalf

1

एनोटेशन

सेना हमेशा "InstallShield चाल" के साथ Light.exe उत्पादन में ऊपर लिख:

XPath = "/ wixOutput/तालिका [@ नाम = 'फ़ाइल']/पंक्ति/फ़ील्ड [5] "इनरटेक्स्ट =" 65535.0.0.0 "