यह एक संकलन समय संपत्ति है!
पता करने के लिए सबसे महत्वपूर्ण बातों में से एक यह है कि "विशिष्ट संस्करण" एक संपत्ति है कि कम से प्रभावी होता है है संकलन समय और नहीं रनटाइम पर।
यह सब किस बारे मे है?
जब कोई प्रोजेक्ट बनाया जाता है, तो प्रोजेक्ट की असेंबली संदर्भों को हल करने की आवश्यकता होती है ताकि भौतिक असेंबलियों का पता लगाया जा सके जो बिल्ड सिस्टम का उपयोग करना चाहिए। यदि "विशिष्ट संस्करण" चेक किया जाता है (देखें अनुभाग "कब" विशिष्ट संस्करण "चेक किया गया है?"), यह विधानसभा रिज़ॉल्यूशन प्रक्रिया के परिणाम को प्रभावित करता है:
- बिल्ड सिस्टम एक भौतिक असेंबली का पता लगाता है जिसका वह संभावित उपयोग कर सकता है
- निर्माण प्रणाली भौतिक असेंबली के संस्करण की तुलना असेंबली संदर्भ के लिए .csproj फ़ाइल में संग्रहीत असेंबली संस्करण से करती है
- यदि दो असेंबली संस्करण बिल्कुल समान हैं, तो रिज़ॉल्यूशन प्रक्रिया सफल होती है और भौतिक असेंबली का उपयोग बिल्ड के लिए किया जाता है
- यदि दो असेंबली संस्करण मेल नहीं खाते हैं, तो भौतिक असेंबली को छोड़ दिया जाता है और अगली संभावित असेंबली का पता लगाकर रिज़ॉल्यूशन प्रक्रिया जारी रहती है
- यदि कोई अधिक संभावित भौतिक असेंबलियाँ स्थित नहीं हो सकती हैं, तो रिज़ॉल्यूशन प्रक्रिया विफल हो जाती है। यह एक संकलक चेतावनी (MSB3245 चेतावनी) में परिणाम है जो बताता है कि संदर्भ हल नहीं किया जा सका।
- दिलचस्प रूप से पर्याप्त है, फिर निर्माण जारी है! यदि कोड में विधानसभा का कोई वास्तविक संदर्भ नहीं है, तो बिल्ड सफल होता है (पहले उल्लेखित चेतावनी के साथ)। यदि कोड में संदर्भ हैं, तो बिल्ड एक त्रुटि के साथ विफल होता है जो दिखता है जैसे कि कोड अज्ञात प्रकार या नामस्थान का उपयोग कर रहे थे। एकमात्र संकेत क्यों बिल्ड वास्तव में विफल रहा चेतावनी MSB3245 है।
आदेश जिसमें विधानसभाओं को हल किया जाता है
असेंबली रिज़ॉल्यूशन प्रक्रिया संभावित विधानसभाओं का क्रम ऐसा प्रतीत होता है:
- विधानसभा
<HintPath>
.csproj फ़ाइल में तत्व द्वारा संदर्भित
- प्रोजेक्ट आउटपुट पथ
- जीएसी
ध्यान दें कि यदि 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 फ़ाइल में मौजूद नहीं है।
"स्थानीय कॉपी करें" पर दुष्प्रभाव
यदि "कॉपी लोकल" संपत्ति "ट्रू" पर सेट है, लेकिन असेंबली रिज़ॉल्यूशन प्रक्रिया "विशिष्ट संस्करण" चेक की वजह से विफल हो जाती है, तो कोई असेंबली कॉपी नहीं की जाती है।
संदर्भ सामग्री