विज़ुअल स्टूडियो में असेंबली रेफरेंस का "विशिष्ट संस्करण" संपत्ति वास्तव में कैसी है?


155

आज विजुअल स्टूडियो 2010 में असेंबली रेफरेंस के "स्पेसिफिक वर्जन" प्रॉपर्टी पर मेरी कड़ी नजर थी। अप्रत्याशित परिणामों के साथ कुछ प्रयोगों के बाद मैं यह जानने के लिए तैयार हूं कि प्रॉपर्टी कैसे काम करती है। यहां तक ​​कि एसओ, यह मुझे प्रतीत होता है, सभी उत्तर नहीं हैं, इसलिए यहां प्रश्न का स्व-उत्तर देने का मेरा प्रयास है:

विज़ुअल स्टूडियो में असेंबली रेफरेंस की "विशिष्ट संस्करण" संपत्ति वास्तव में कैसी है ?

जवाबों:


255

यह एक संकलन समय संपत्ति है!

पता करने के लिए सबसे महत्वपूर्ण बातों में से एक यह है कि "विशिष्ट संस्करण" एक संपत्ति है कि कम से प्रभावी होता है है संकलन समय और नहीं रनटाइम पर।

यह सब किस बारे मे है?

जब कोई प्रोजेक्ट बनाया जाता है, तो प्रोजेक्ट की असेंबली संदर्भों को हल करने की आवश्यकता होती है ताकि भौतिक असेंबलियों का पता लगाया जा सके जो बिल्ड सिस्टम का उपयोग करना चाहिए। यदि "विशिष्ट संस्करण" चेक किया जाता है (देखें अनुभाग "कब" विशिष्ट संस्करण "चेक किया गया है?"), यह विधानसभा रिज़ॉल्यूशन प्रक्रिया के परिणाम को प्रभावित करता है:

  • बिल्ड सिस्टम एक भौतिक असेंबली का पता लगाता है जिसका वह संभावित उपयोग कर सकता है
  • निर्माण प्रणाली भौतिक असेंबली के संस्करण की तुलना असेंबली संदर्भ के लिए .csproj फ़ाइल में संग्रहीत असेंबली संस्करण से करती है
  • यदि दो असेंबली संस्करण बिल्कुल समान हैं, तो रिज़ॉल्यूशन प्रक्रिया सफल होती है और भौतिक असेंबली का उपयोग बिल्ड के लिए किया जाता है
  • यदि दो असेंबली संस्करण मेल नहीं खाते हैं, तो भौतिक असेंबली को छोड़ दिया जाता है और अगली संभावित असेंबली का पता लगाकर रिज़ॉल्यूशन प्रक्रिया जारी रहती है
  • यदि कोई अधिक संभावित भौतिक असेंबलियाँ स्थित नहीं हो सकती हैं, तो रिज़ॉल्यूशन प्रक्रिया विफल हो जाती है। यह एक संकलक चेतावनी (MSB3245 चेतावनी) में परिणाम है जो बताता है कि संदर्भ हल नहीं किया जा सका।
  • दिलचस्प रूप से पर्याप्त है, फिर निर्माण जारी है! यदि कोड में विधानसभा का कोई वास्तविक संदर्भ नहीं है, तो बिल्ड सफल होता है (पहले उल्लेखित चेतावनी के साथ)। यदि कोड में संदर्भ हैं, तो बिल्ड एक त्रुटि के साथ विफल होता है जो दिखता है जैसे कि कोड अज्ञात प्रकार या नामस्थान का उपयोग कर रहे थे। एकमात्र संकेत क्यों बिल्ड वास्तव में विफल रहा चेतावनी MSB3245 है।

आदेश जिसमें विधानसभाओं को हल किया जाता है

असेंबली रिज़ॉल्यूशन प्रक्रिया संभावित विधानसभाओं का क्रम ऐसा प्रतीत होता है:

  1. विधानसभा <HintPath>.csproj फ़ाइल में तत्व द्वारा संदर्भित
  2. प्रोजेक्ट आउटपुट पथ
  3. जीएसी

ध्यान दें कि यदि GAC में असेंबली के कई संस्करण मौजूद हैं, तो रिज़ॉल्यूशन प्रक्रिया सबसे पहले असेंबली को उच्चतम संस्करण के साथ हल करने का प्रयास करती है। यह केवल तभी महत्वपूर्ण है जब "विशिष्ट संस्करण" चेक नहीं बनाया गया है।

"विशिष्ट संस्करण" की जाँच कब की जाती है?

विजुअल स्टूडियो अपने निर्णय को स्वीकार करता है कि ".csproj फ़ाइल में मिली जानकारी के दो टुकड़ों पर" विशिष्ट संस्करण "की जाँच करें या नहीं:

  • <SpecificVersion>तत्व की उपस्थिति या अनुपस्थिति , और इसका मूल्य (यदि यह मौजूद है)
  • विधानसभा संदर्भ में संस्करण की जानकारी की उपस्थिति या अनुपस्थिति

यह है कि संस्करण जानकारी के साथ एक विशिष्ट विधानसभा संदर्भ कैसा दिखता है:

<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>True</SpecificVersion>
  <HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>

और यह है कि विधानसभा संदर्भ बिना संस्करण जानकारी के कैसा दिखता है :

<Reference Include="Foo">
[...]

निम्न तालिका से पता चलता है कि "विशिष्ट संस्करण" चेक कब किया जाता है, और कब नहीं।

                            |     Version information
                            |  Present       Not present
----------------------------+------------------------------
<SpecificVersion>           |
- Present, has value True   |    Yes (1)        Yes (check always fails) (2)
- Present, has value False  |    No  (3)        No (4)
- Not present               |    Yes (5)        No (6)

यहाँ आश्चर्यजनक बात यह है कि दोनों <SpecificVersion>और संस्करण की जानकारी अनुपस्थित होने पर कोई जाँच नहीं की जाती है (केस 6)। मुझे उम्मीद है कि चेक का प्रदर्शन किया जाएगा और हमेशा विफल रहेगा (केस 2 के रूप में) क्योंकि मेरी समझ में अनुपस्थिति का <SpecificVersion>डिफ़ॉल्ट मूल्य "ट्रू" है। यह दृश्य स्टूडियो 2010 का एक क्विक हो सकता है जहां मैंने अपने परीक्षण किए थे।

जब आप Visual Studio UI (संदर्भ और हिट F4 का चयन करें) में असेंबली संदर्भ के गुणों की जांच करते हैं, तो "विशिष्ट संस्करण" गुण के लिए आपके द्वारा देखा गया मान बताता है कि विज़ुअल स्टूडियो "विशिष्ट संस्करण" का प्रदर्शन करने जा रहा है या नहीं जाँच। मामले में 6 यूआई "ट्रू" दिखाएगा, हालांकि <SpecificVersion>तत्व .csproj फ़ाइल में मौजूद नहीं है।

"स्थानीय कॉपी करें" पर दुष्प्रभाव

यदि "कॉपी लोकल" संपत्ति "ट्रू" पर सेट है, लेकिन असेंबली रिज़ॉल्यूशन प्रक्रिया "विशिष्ट संस्करण" चेक की वजह से विफल हो जाती है, तो कोई असेंबली कॉपी नहीं की जाती है।

संदर्भ सामग्री


विस्तार के लिए धन्यवाद। क्या मैं सिर्फ जांच कर सकता हूं ... विधानसभा संस्करण की जाँच केवल मजबूत नामों वाली विधानसभाओं के लिए होती है; क्या वह सही है? इसके अलावा, जब हम किसी असेंबली के संस्करण की जाँच करने की बात करते हैं - तो क्या यह संदर्भित विधानसभा के नाम की तुलना करके किया जाता है ? (एक मजबूत नाम वाली असेंबली के मामले में, उस नाम में संस्करण की जानकारी शामिल है, इसलिए यह एक अलग संस्करण फ़ील्ड की तरह जाँच नहीं है?)
गेविन होप

2
@GavinHope प्रश्न 1: नहीं, संस्करण की जाँच मजबूत नामों तक सीमित नहीं है, मुख्य रूप से क्योंकि एक विधानसभा नाम संस्करण को शामिल कर सकता है, लेकिन फिर भी एक मजबूत नाम नहीं हो सकता है (जैसे अगर वह PublicKeyToken=भाग याद आ रहा है )। इसके अलावा, यदि आप मेरे पोस्ट के अंत की ओर तालिका की जांच करते हैं, तो आप देख सकते हैं कि संस्करण की जाँच हो सकती है, भले ही वह Version=भाग thecsproj में असेंबली के नाम से गायब हो। प्रश्न 2: मेरा मानना ​​है कि विधानसभा का नाम तुलना के लिए उपयोग किया जाता है, हाँ। मुझे जानकारी के लिए किसी अन्य स्रोत का पता नहीं होगा।
हर्ज़ेबुब

"6 स्थिति में UI" ट्रू "दिखाएगा, हालाँकि <स्पेसिफिकेशन्स> तत्व .csproro फ़ाइल में मौजूद नहीं है।" - ऐसा प्रतीत होता है कि डिफ़ॉल्ट मान True है । करने के लिए यूआई में विशिष्ट संस्करण टॉगल करने के बाद यह सच है<SpecificVersion> टैग पूरी तरह से हटा दिया गया था, जो पहले के एक मूल्य था झूठी
समीस

@herzbube - मुझे लगता है कि विज़ुअल स्टूडियो> प्रोजेक्ट प्रॉपर्टीज विंडो में "स्पेसिफिक वर्जन" का अर्थ है कि आप यहां जो कह रहे हैं, उसके विपरीत है (आप जो अपेक्षा करेंगे उसके विपरीत है)। विज़ुअल स्टूडियो का कहना है कि "विशिष्ट संस्करण" का मूल्य (सही या गलत) इंगित करता है कि क्या यह विधानसभा विधानसभा समाधान के लिए बहु-लक्ष्यीकरण नियमों के संबंध में हल किया जा सकता है "।
N73k

35

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

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

परिणाम को समझने के लिए बहुत महत्वपूर्ण है, आपको दुर्घटनाओं से बचने के लिए कार्यक्रम के संपूर्ण निर्माण को फिर से तैयार करने की आवश्यकता है। रनटाइम पर संस्करण बेमेल प्रोग्राम को क्रैश कर देता है और केवल एक <bindingRedirect>.config फ़ाइल के साथ दबाया जा सकता है जो जोखिम भरा है।


2
इस जानकारी के लिए धन्यवाद कि "विशिष्ट संस्करण" क्यों महत्वपूर्ण है, यह विशुद्ध रूप से यांत्रिक पहलुओं का एक अच्छा साथी है जिसे मैं अपने उत्तर में कवर कर रहा हूं।
हर्ज़ब्यूब

@Hans Passant - क्या आपका अंतिम पैराग्राफ SpecificVersion के लिए वैध है या सही? मुझे लगता है कि जब आप इसे सच करते हैं तो ये परिणाम होते हैं।
ग्रीनएडएंडी

1
SpecificVersion केवल आपके ऐप के निर्माण पर लागू होता है। रनटाइम में CLR हमेशा संदर्भ असेंबली संस्करण संख्या के साथ सटीक मिलान पर जोर देता है। यदि आपने बिल्ड समय में एक नए संस्करण का उपयोग किया है, तो यह रनटाइम के साथ-साथ उस नए संस्करण को भी होना चाहिए।
हंस पसेंट

1
VS2013 और .Net 4.5.1 से सावधान रहें। AutoGenerateBindingRedirects वे dll बाइंडिंग को एक नए संस्करण में पुनर्निर्देशित कर सकते हैं, भले ही आपने इसे एक विशिष्ट संस्करण का उपयोग करने के लिए कहा हो
डेनिस कुईपर्स

1
@HansPassant मुझे लगा कि [AssemblyVersion]जब असेंबली मजबूत नाम पर हस्ताक्षर नहीं होते हैं तो सीएलआर को ध्यान में नहीं रखा जाता है।
tm1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.