2011-07-22 12 views
17

ClickOnce केवल निर्धारित करने के लिए जो dll फ़ाइलों ग्राहक की मशीन के लिए कॉपी करने के लिए या यह भी निर्भरता फ़ाइलें निर्धारित करने के लिए एक विधानसभा के आंतरिक पूछताछ करता आवेदन मैनिफ़ेस्ट फ़ाइल पर लग रही है?ClickOnce - फ़ाइल पहले से ही मौजूद है त्रुटि - क्यों एक DLL फ़ाइल ClickOnce द्वारा दो बार कॉपी करने के लिए कोशिश कर रहा है?

कारण मैं पूछ रहा हूं क्योंकि मुझे क्लिकऑन: के साथ प्रकाशित एक WPF .NET 4 एप्लिकेशन लॉन्च करने का प्रयास करते समय नीचे क्लिकऑन त्रुटि मिल रही है फ़ाइल C:\Users\CNelson\AppData\Local\Temp\Deployment\PGX6P33A.35N\AJQL8AC8.D60\tx16_rtf.dll पहले से मौजूद है।

यह त्रुटि तब शुरू हुई जब मैंने दो तृतीय पक्ष .NET dlls का संदर्भ शामिल किया है जो दोनों एक अप्रबंधित डीएलएल फ़ाइल (tx16_rtf.dll) का संदर्भ देते हैं। मैं tx16_rtf.dll इसलिए मैं अपने प्रोजेक्ट में यह भी शामिल है ग्राहक के पीसी पर बिन फ़ोल्डर में प्रतिलिपि और 'सामग्री' और 'हमेशा की प्रतिलिपि' के लिए आउटपुट निर्देशिका को कॉपी करने के लिए कार्रवाई बिल्ड सेट किया जा करना चाहते हैं।

हालांकि, किसी कारण से जब मैं एप्लिकेशन लॉन्च करने का प्रयास करता हूं तो ClickOnce फ़ाइल 'tx16_rtf.dll' को दो बार कॉपी करने का प्रयास कर रहा है, जिसके परिणामस्वरूप त्रुटि होती है।

यदि मैं तैनाती मैनिफेस्ट फ़ाइल को देखता हूं तो मैं स्पष्ट रूप से फ़ाइल 'tx16_rtf.dll' फ़ाइल के लिए एक और केवल एक प्रविष्टि देख सकता हूं। तो, मेरा सवाल यह है कि क्लिकऑन फ़ाइल को 'tx16_rtf.dll' दो बार कॉपी करने का प्रयास क्यों करता है यदि यह केवल तैनाती मेनिफेस्ट फ़ाइल में मौजूद है?

नीचे तैनाती मैनिफ़ेस्ट फ़ाइल है कि संदर्भ 'tx16_rtf.dll' का एक टुकड़ा है:

<file name="tx16_rtf.dll" size="839680"> 
    <hash> 
     <dsig:Transforms> 
     <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> 
     </dsig:Transforms> 
     <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
     <dsig:DigestValue>V6i2QcARl3+1SJHCugoazb9zrOY=</dsig:DigestValue> 
    </hash> 
    </file> 
+0

इस समस्या का आपका समाधान क्या था? –

+0

मेरा समाधान मेरी परियोजना में अप्रबंधित डीएलएस का संदर्भ नहीं देना था। इस प्रकार, ClickOnce उन्हें प्रकट में शामिल नहीं करेगा। इसके बजाए, मैंने जो किया था, वह एक ज़िप फ़ाइल में अप्रबंधित डीएलएल फाइलों को सेट करना था (सेट एक्शन टू कंटेंट 'पर सेट करें) और जब मेरा एप्लिकेशन शुरू होता है तो यह अप्रबंधित डीएलएस को सही निष्पादन निर्देशिका में अनजिप कर देगा ... और सबकुछ एक जैसा काम करता है आकर्षण। – ChrisNel52

उत्तर

10

अपने दृश्य स्टूडियो समाधान में, कैसे फ़ाइल जोड़ दिया जाता है? कृपया निम्नलिखित प्रयास कीजिए।

अपनी परियोजना के लिए dll जोड़ें।

यदि आपके पास संदर्भों में डीएलएल का संदर्भ है, तो इस तरह के डीएल पर गुण सेट करें: बिल्ड करें = कोई नहीं, आउटपुट निर्देशिका में कॉपी करें = "कॉपी न करें"। फिर संदर्भ हटाएं और फिर संदर्भ को फिर से जोड़ें, लेकिन अपने स्थानीय प्रोजेक्ट फ़ोल्डर में उस डीएल को इंगित करें। संदर्भ पर, "स्थानीय प्रतिलिपि बनाएँ" को सही पर सेट करें।

आप dll के लिए एक संदर्भ की जरूरत नहीं है, तो इस तरह dll पर गुण सेट: निर्माण कार्य = "प्रतिलिपि"। आउटपुट निर्देशिका में कॉपी करें = "हमेशा कॉपी करें"।

यदि आपके पास कोई संदर्भ है, तो आप संदर्भ के आधार पर शामिल होने का कारण चाहते हैं, न कि डीएल गुणों पर। यदि आपके पास कोई संदर्भ नहीं है, तो आप विशेष रूप से शामिल होने के लिए डीएलएल सेट करना चाहते हैं।

एप्लिकेशन फ़ाइलें संवाद भी जांचें और सुनिश्चित करें कि डीएलएल को शामिल (पूर्व शर्त) के रूप में चिह्नित नहीं किया गया है, लेकिन इसमें शामिल या शामिल (आवश्यक) शामिल है।

+1

मैं mage.exe का उपयोग कर मैनिफेस्ट फ़ाइल के निर्माण को स्वचालित करता हूं। मुझे लगता है कि मेरे पास क्लिकऑन और मैनिफेस्ट फाइलों की पूरी तरह से अच्छी समझ है, लेकिन कुछ गुप्त है कि क्लिकऑन अप्रबंधित डीएलएस के साथ कर रहा है। हालांकि, क्लिकऑन के आंतरिक कार्यों पर विस्तृत दस्तावेज खोजने की कोशिश करना असंभव लगता है। – ChrisNel52

+0

रॉबिन डॉटनेट ने अपनी स्पष्टीकरण के कारण मुझे अपनी डुप्लिकेट डीएल क्लिकऑन समस्या के उत्तर का जवाब दिया ताकि मैंने आपको ऊपर उठाया। – TWood

+13

देर से पार्टी में शामिल होने के लिए खेद है, लेकिन खोजकर्ताओं के लाभ के लिए, मुझे Automapper.Net4.dll के साथ एक ही समस्या थी। मुद्दा यह था कि मैं 'Automapper.Net4.dll' और 'Automapper.dll' दोनों का संदर्भ दे रहा था, (जिसे बाद में मैंने Net4.dll को संदर्भित किया था)। उपर्युक्त सलाह का पालन किया। संदर्भ क्लिकऑन के बारे में शिकायत हटा दी, बिन फ़ोल्डर हटा दिया और परियोजना को फिर से बनाया। नेट 4 डीएल जादुई रूप से फिर से दिखाई दिया, इसलिए प्रत्यक्ष संदर्भ की आवश्यकता नहीं थी। इसके बाद ClickOnce के साथ कोई जांच नहीं। – HockeyJ

8

आप उल्लेख नहीं करते हैं कि आप अद्भुत (खांसी) MAGE.EXE का उपयोग अपने परिनियोजन प्रकट करने के लिए कर रहे हैं। हालांकि मुझे एक ही 'फ़ाइल एक्स पहले से मौजूद है' त्रुटि का सामना करना पड़ा है, और यह प्रबंधित असेंबली के कारण होता है जो पी/Invoke के माध्यम से देशी असेंबली में कार्यों को कॉल करता है।

प्रत्येक के लिए स्थान MAGE.EXE को -FromDirectory तर्क द्वारा निर्दिष्ट विधानसभा में कामयाब रहे, दाना तत्वों की एक <dependency><dependentAssembly>...</dependentAssembly></dependency> सेट (विधानसभा codebase, पहचान, आकार, हैश, आदि सहित) का निर्माण करेगा। एक दूसरे को फ़ाइल (गैर-प्रबंधित देशी विधानसभाओं सहित) के लिए MAGE.EXE एक <file>...</file> तत्व पैदा करेगा।

हालांकि पर स्थापित समय, ऐसा लगता है कि ClickOnce वास्तव में हर उस प्रबंधित विधानसभा के प्रकट मेटाडाटा निरीक्षण करता है।इसलिए यदि आपके एप्लिकेशन में प्रबंधित AssemblyA है जो P/NativeAssemblyB (या आपके मामले में tx16_rtf.dll) में कोड आमंत्रित करता है, तो आप ILDASM के माध्यम से देखेंगे कि प्रबंधित एस्परब्ला के लिए मेनिफेस्ट में .module extern NativeAssemblyB.dll कथन है।

मैं केवल क्लिकऑनन मान सकता हूं, <dependentAssembly codebase="ManagedAssemblyA.dll"> तत्व को संसाधित करते समय, असेंबली के मेटाडाटा का निरीक्षण करता है, यह देखता है कि एक देशी असेंबली संदर्भित है, यह देखता है कि यह एक ही तैनाती स्थान पर भी है और इसे कॉपी करता है। फिर, जब <file name="NativeAssemblyB.dll"> तत्व को संसाधित करते समय, यह त्रुटियों के रूप में यह पहले से ही इस फ़ाइल की प्रतिलिपि बना चुका है और स्थापित करने में असफल मानना ​​कार्रवाई का सबसे सुरक्षित तरीका है। मुझे माइक्रोसॉफ्ट द्वारा कहीं भी इस व्यवहार को दस्तावेज नहीं मिला है।

तो समाधान MAGE.EXE के साथ परिनियोजन मैनिफेस्ट उत्पन्न करने के बाद है, लेकिन इसे हस्ताक्षर करने से पहले, किसी भी देशी असेंबली के लिए <file> तत्वों को हटा दें। देशी असेंबली को अभी भी उसी तैनाती स्थान में उपलब्ध होने की आवश्यकता है क्योंकि क्लिकऑन ऐप द्वारा आवश्यक शेष असेंबली हैं।

हमारे मामले में हमने इसे स्वचालित किया क्योंकि हम प्रत्येक निरंतर एकीकरण निर्माण के साथ तैनाती के प्रकटन की पीढ़ी को भी स्वचालित करते हैं (जैसा विजुअल स्टूडियो 2010 के अंदर प्रकाशन विज़ार्ड का उपयोग करने के विपरीत है जो आपको थोड़ा अधिक नियंत्रण देता है); हमारे पास एक पावरहेल स्क्रिप्ट है जो तैनाती मैनिफेस्ट बनाने के लिए MAGE.EXE को आमंत्रित करती है, कुछ और पावरहेल एक्सएमएल में हेरफेर करने और <file> तत्व (पावरहेल के साथ वास्तव में आसान ... अच्छी किस्मत इसे बैच फ़ाइल के साथ कर रही है!) को हटा दें, फिर हम आह्वान करें मैनिफेस्ट पर हस्ताक्षर करने के लिए MAGE.EXE।

+0

महान जवाब! मैं आपके समाधान को लागू करने जा रहा हूं। – ChrisNel52

0

अपने nuget संकुल एकीकरण, यदि आप 2 संदर्भ एक 3 nuget पैकेज के विभिन्न संस्करणों पर निर्भर है, कभी कभी आप एक ही nuget पैकेज के लिए 2 संदर्भ हो सकता है। इससे क्लिकऑन असफल हो जाएगा।