2010-02-18 4 views
5

मैं सी ++ के लिए विजुअल स्टूडियो 2008 एसपी 1 का उपयोग कर रहा हूं। संकलन करते समय, विजुअल स्टूडियो को सीआरटी और एमएफसी डीएलएल के संस्करण के साथ चयन करने की आवश्यकता है, एप्लिकेशन को लिंक किया जाना चाहिए, संस्करण 9.0.21022.8 (= आरटीएम), 9.0.30729.17 (= एसपी 1) या 9.0.30729.4148 (= सुरक्षा अद्यतन के साथ एसपी 1) । मैं जानना चाहता हूं कि आप कैसे चुन सकते हैं कि दोनों संस्करणों के विरुद्ध किससे जुड़ा होगा। क्या कोई जानता है?वीसी 2008 डीएलएल के संस्करण का चयन कैसे करें आवेदन से जुड़ा होना चाहिए?

नोट: इस महत्वपूर्ण है जब एक private assembly का उपयोग कर, क्योंकि आप जानते हैं जो कुलपति 9.0 DLLs के संस्करणों .exe के साथ कॉपी करने के लिए की जरूरत है।

नोट कि _BIND_TO_CURRENT_VCLIBS_VERSION ध्वज केवल यह सुनिश्चित करता है कि सही संस्करण मेनिफेस्ट में शामिल है। रनटाइम पर डीएलएल संस्करण चयन स्पष्ट रूप से मैनिफेस्ट फ़ाइल में शामिल संस्करण के आधार पर नहीं किया जाता है। भले ही मैनिफेस्ट फ़ाइल कहती है कि v21022 का उपयोग किया जाना चाहिए, .exe v30729 का उपयोग करता है। डीएलएल। मुझे यह पता है, क्योंकि यह std :: tr1 :: weakptr का उपयोग करता है, जो v21022 में मौजूद नहीं है।

+1

बस एक नोट: विजुअल स्टूडियो 2008 एसपी 1 9.0.3072 9 .1 –

+0

@ सिमॉन: आप सही हैं! मैंने अपना प्रश्न अपडेट किया। –

उत्तर

9

_BIND_TO_CURRENT_VCLIBS_VERSION मैनिफेस्ट में वर्तमान संस्करण सेट करता है - या यदि आरटीएम संस्करण नहीं है। और इसे मैनिफेस्ट में सेट करना यह करने का सही तरीका है।

जो भी आप देख रहे हैं वह असेंबली नीति फ़ाइल का प्रभाव है: - जब 2008 एसपी 1 रनटाइम युक्त वीसीआरएडिस्ट पैकेज स्थापित होता है, तो यह एक बाध्यकारी रेडियोधर्मी प्रविष्टि के साथ विनसैक्स स्टोर में एक नीति फ़ाइल स्थापित करता है जो लोड करने के प्रयासों को पुनर्निर्देशित करता है एसपी 1 रनटाइम के लिए आरटीएम रनटाइम।

तो अनुप्रयोग जो उनके मैनिफेस्ट में आरटीएम रनटाइम निर्दिष्ट करते हैं, एसपी 1 रनटाइम लोड करेंगे, और एसपी 1 रनटाइम निर्दिष्ट करने वाले अनुप्रयोग एसपी 1 रनटाइम लोड करेंगे।

यदि आप वास्तव में आरटीएम रनटाइम का उपयोग करना चाहते हैं, तब भी जब एसपी 1 रनटाइम और पॉलिसी फाइलें स्थापित हों, तो आपको अपने मैनिफेस्ट में आरटीएम संस्करण निर्दिष्ट करना होगा, और एक एप्लीकेशन कॉन्फ़िगरेशन फ़ाइल का उपयोग करना होगा। असल में "yourappname.exe.config" (या "yourdllname.dll.2.config" अगर यह एक अलगाव जागरूक डीएलएल दुःख पैदा करता है)। आवेदन संगतता फ़ाइलें एक बाध्यकारी रेडियोधर्मी तत्व प्रदान कर सकती हैं जो मैनिफेस्ट में निर्दिष्ट किसी असेंबली संस्करण को ओवरराइड करती है, या नीति फ़ाइलों को ओवरराइड करती है।

यह कॉन्फ़िग फ़ाइल आरटीएम क्रम लोड करने के लिए ओएस बता देंगे, भले ही SP1 क्रम स्थापित किया गया है: -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<configuration> 
    <windows> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/> 
       <bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </windows> 
</configuration> 

नोट: oldVersion="9.0.30729.1-9.1.0.0"

देखें: Application Configuration Files oldVersion एक सीमा होने के लिए अनुमति दी है एमएसडीएन पर दस्तावेज।

+0

इस स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। यह वास्तव में मैंने देखा अजीब व्यवहार बताता है। –

0

कंपाइलर का उपयोग करने के लिए सीएचटी कोड का निर्धारण करने के लिए .h और .lib फ़ाइलों का उपयोग करता है। अपनी प्रोजेक्ट के लिए अपनी शामिलियों और lib खोज निर्देशिका निर्माण सेटिंग्स को उन निर्देशिकाओं में देखने के लिए बदलें जहां उपयुक्त .lib और .h फ़ाइलें मौजूद हैं।

उस ने कहा, आप नवीनतम सीआरटी के अलावा कुछ भी उपयोग करने की आवश्यकता क्यों महसूस करते हैं?

3

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

या

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

आप एक निर्दिष्ट संस्करण के खिलाफ लिंक कर सकते हैं परिभाषित करके।

+0

या केवल _BIND_TO_CURRENT_CRT_VERSION को 1 (= नवीनतम संस्करण) या 0 (= सबसे पुराना संस्करण) परिभाषित करके। क्या वो सही है? –

+0

हां, यह सही है। लेकिन यदि आप एक निर्दिष्ट संस्करण को बांधना चाहते हैं तो ऊपर से परिभाषित करें। मुझे यह मामला मिला कि मुझे 9.0.3072 9 .1 से बांधना पड़ा लेकिन _BIND ... नवीनतम के लिए 9.0.3072 9.4148 होगा, इसलिए मुझे इसे परिभाषित करना था। –