.NET 4.0 में एक नया GAC है, क्यों?


300

%windir%\Microsoft.NET\assembly\नया GAC है । क्या इसका मतलब है कि अब हमें दो GAC को प्रबंधित करना होगा, एक .NET 2.0-3.5 अनुप्रयोगों के लिए और दूसरा .NET 4.0 अनुप्रयोगों के लिए?

सवाल है, क्यों?


7
सवाल पूछने के लिए धन्यवाद..मैं भी बहुत उलझन में हूं जब मुझे इसके मूल स्थान में
जीएसी

2
अच्छा सवाल ... बहुत धन्यवाद।
smwikipedia

1
आपके प्रश्न के लिए +1। मैंने नेट 4.0 के तहत विकास शुरू किया और "दोहरी" जीएसी मुद्दे से उलझन में था,।
हर्नान

3
इसे कुछ पुनरावृत्तियों में लिया गया, लेकिन Microsoft ने आखिरकार .NET में DLL हेल लाया। वाह!
कुछ भी नहीं

जवाबों:


181

हां, चूंकि 2 अलग ग्लोबल असेंबली कैश (जीएसी) हैं, इसलिए आपको उनमें से प्रत्येक को व्यक्तिगत रूप से प्रबंधित करना होगा।

.NET फ्रेमवर्क 4.0 में, GAC कुछ परिवर्तनों से गुज़री। जीएसी को दो में विभाजित किया गया था, प्रत्येक सीएलआर के लिए एक।

.NET फ्रेमवर्क 2.0 और .NET फ्रेमवर्क 3.5 दोनों के लिए उपयोग किया जाने वाला सीएलआर संस्करण सीएलआर 2.0 है। जीएसी को विभाजित करने के लिए पिछले दो ढांचे के रिलीज में कोई आवश्यकता नहीं थी। नेट फ्रेमवर्क 4.0 में पुराने अनुप्रयोगों को तोड़ने की समस्या।

सीएलआर 2.0 और सीएलआर 4.0 के बीच के मुद्दों से बचने के लिए, जीएसी अब प्रत्येक रनटाइम के लिए निजी जीएसी में विभाजित है। मुख्य परिवर्तन यह है कि सीएलआर v2.0 अनुप्रयोग अब जीएलआर में सीएलआर v4.0 विधानसभाओं को नहीं देख सकते हैं।

स्रोत

क्यों?

ऐसा लगता है क्योंकि .NET 4.0 में CLR परिवर्तन था लेकिन 2.0 से 3.5 में नहीं। यही हाल 1.1 से 2.0 सीएलआर का रहा। ऐसा लगता है कि GAC में असेंबली के विभिन्न संस्करणों को स्टोर करने की क्षमता है जब तक वे एक ही सीएलआर से नहीं होते हैं। वे पुराने अनुप्रयोगों को तोड़ना नहीं चाहते हैं।

4.0 में GAC परिवर्तनों के बारे में MSDN में निम्न जानकारी देखें ।

उदाहरण के लिए, यदि .NET 1.1 और .NET 2.0 दोनों एक ही GAC साझा करते हैं, तो .NET 1.1 अनुप्रयोग, इस साझा GAC से असेंबली लोड कर रहा है, .NET 2.0 असेंबलियों को प्राप्त कर सकता है, जिससे .NET 1.1 अनुप्रयोग टूट सकता है।

.NET फ्रेमवर्क 2.0 और .NET फ्रेमवर्क 3.5 दोनों के लिए उपयोग किया जाने वाला सीएलआर संस्करण सीएलआर 2.0 है। इसके परिणामस्वरूप, जीएसी को विभाजित करने के लिए पिछले दो रूपरेखा रिलीज में कोई आवश्यकता नहीं थी। पुराने (इस मामले में, .NET 2.0) को तोड़ने की समस्या नेट फ्रेमवर्क 4.0 में पुनर्जीवित होती है, जिस बिंदु पर सीएलआर 4.0 जारी किया जाता है। इसलिए, सीएलआर 2.0 और सीएलआर 4.0 के बीच हस्तक्षेप के मुद्दों से बचने के लिए, जीएसी अब प्रत्येक रनटाइम के लिए निजी जीएसी में विभाजित है।

जैसा कि CLR भविष्य के संस्करणों में अपडेट किया गया है, आप उसी चीज की उम्मीद कर सकते हैं। यदि केवल भाषा बदलती है तो आप उसी GAC का उपयोग कर सकते हैं।


18
वह ब्लॉग पोस्ट केवल ओपी की खोज को पुनर्स्थापित करता है, यह नहीं समझाता है कि जीएसी को विभाजित करने की आवश्यकता क्यों है। यह स्पष्ट नहीं है, मूल GAC 4.0 असेंबलियों को अलग रखने में काफी सक्षम होता। उनके पास एक नया [
असेंबलीवेशन

1
@ हंस: शायद सटीक कारण नहीं है, लेकिन यह कहता है: "सीएलआर 2.0 और सीएलआर 4.0 के बीच के मुद्दों से बचने के लिए", इसके अंदर भी 2 प्रश्न थे। दूसरा सवाल यह है: "क्या इसका मतलब है कि अब हमें दो GAC, .NET 2.0-3.5 ऐप्स के लिए एक और .NET 4.0 ऐप्स के लिए दूसरा प्रबंध करना होगा?"
ब्रायन आर। बॉडी

2
आपको अपने किसी एक लिंक से इसे उद्धृत करना चाहिए: "उदाहरण के लिए, यदि .NET 1.1 और .NET 2.0 दोनों ने एक ही GAC साझा किया है, तो .NET 1.1 एप्लिकेशन, इस साझा GAC से असेंबली लोड कर रहा है, .NET 2.0 असेंबली प्राप्त कर सकता है। , जिससे .NET 1.1 एप्लिकेशन टूट रहा है। "
मैक्स टोरो

67

मैं यह भी जानना चाहता था कि 2 जीएसी क्यों और टिप्पणी अनुभाग में मार्क मिलर द्वारा निम्नलिखित स्पष्टीकरण पाया गया के .NET 4.0 है 2 वैश्विक असेंबली कैश (GAC) :

मार्क मिलर ने कहा ... 28 जून, 2010 12:13 अपराह्न

पोस्ट के लिए धन्यवाद। "हस्तक्षेप के मुद्दे" जानबूझकर अस्पष्ट थे। लेखन के समय, मुद्दों की अभी भी जांच की जा रही थी, लेकिन यह स्पष्ट था कि कई टूटे हुए परिदृश्य थे।

उदाहरण के लिए, कुछ अनुप्रयोग असेंबली का उपयोग करते हैं। विधानसभा के उच्चतम संस्करण को लोड करने के लिए। यदि उच्चतम संस्करण को v4 के साथ संकलित किया गया था, तो एक v2 (3.0 या 3.5) ऐप इसे लोड नहीं कर सकता था, और ऐप क्रैश हो जाता, भले ही कोई ऐसा संस्करण हो जो काम करता हो। मूल रूप से, हमने GAC को इसके मूल स्थान के तहत विभाजित किया, लेकिन इससे विंडोज़ अपग्रेड परिदृश्यों में कुछ समस्याएँ हुईं। इन दोनों में शामिल कोड जो पहले ही भेज दिए गए थे, इसलिए हमने अपने (संस्करण-विभाजन वाले जीएसी को दूसरी जगह स्थानांतरित कर दिया।

इसका अधिकांश अनुप्रयोगों पर कोई प्रभाव नहीं होना चाहिए, और इसमें कोई रखरखाव बोझ नहीं है। दोनों स्थानों को केवल देशी जीएसी एपीआई का उपयोग करके एक्सेस या संशोधित किया जाना चाहिए, जो कि उम्मीद के मुताबिक विभाजन से निपटते हैं। जिन स्थानों पर यह सतह होती है, वे एपीआई के माध्यम से होते हैं जो GAC के पथों को प्राप्त करते हैं जैसे GetCachePath, या प्रबंधित कोड में लोड किए गए mscorlib के पथ की जांच करना।

यह ध्यान देने योग्य है कि जब हमने v2 को जारी किया था तब हमने GAC स्थानों को संशोधित किया था जब हमने असेंबली पहचान के हिस्से के रूप में आर्किटेक्चर पेश किया था। उन लोगों ने GAC_MSIL, GAC_32 और GAC_64 को जोड़ा, हालांकि सभी अभी भी% windir% \ असेंबली के तहत हैं। दुर्भाग्य से, यह इस रिलीज के लिए एक विकल्प नहीं था।

आशा है कि यह भविष्य के पाठकों की मदद करता है।


3
लिंक किए गए लेख पर मिलर की टिप्पणियां विषय पर एक अंदरूनी सूत्र का दृश्य प्रदान करती हैं।
निमेश माधवन

66

यह बहुत मायने नहीं रखता है, मूल जीएसी पहले से ही असेंबली के विभिन्न संस्करणों को संग्रहीत करने में काफी सक्षम था। और यह मानने का कोई कारण नहीं है कि कोई प्रोग्राम कभी गलती से गलत असेंबली का संदर्भ देगा, सभी .NET 4 असेंबली को [असेंबली वर्जन] 4.0.0.0 तक बंप किया गया। नए इन-प्रोसेस साइड-बाय-साइड फीचर को इसे नहीं बदलना चाहिए।

मेरा अनुमान है: वहाँ पहले से ही बहुत सारे .NET प्रोजेक्ट्स थे जो "जीएसी में कुछ भी कभी भी संदर्भ नहीं" नियम को तोड़ते थे। मैंने इसे इस साइट पर कई बार देखा है।

उन परियोजनाओं को तोड़ने से बचने का केवल एक ही तरीका है: जीएसी को स्थानांतरित करें। Microsoft पर बैक-कमिटर्स पवित्र हैं।


3
यह एकमात्र उत्तर है जो यह समझाने की कोशिश करता है कि ऐसा क्यों है। +1
एड एस।

1
@ हंस पासेंट: "जीएसी में किसी चीज को कभी भी सीधे" नियम से क्या मतलब है?
मैक्स टोरो

2
@ मोम: आपकी मशीन पर .NET असेंबली की दो प्रतियां हैं। वे c: \ windows \ microsoft.net और c: \ program files \ reference विधानसभाओं में संदर्भ असेंबली होने का मतलब है। और रनटाइम पर इस्तेमाल होने वाले, GAC @ c: \ windows \ विधानसभा। वे समान नहीं हैं, 64-बिट एक उदाहरण होगा। Microsoft ने GAC वालों को शेल एक्सटेंशन हैंडलर के संदर्भ में किसी से बचने की पूरी कोशिश की। और संदर्भ जोड़ें संवाद। 100% प्रभावी नहीं
हंस पैसेंट

@Hans Passant: एक सीधा संदर्भ 'c: \ WINDOWS \ Assembly \ GAC_MSIL \ System \ 2.0.0.0__b77a5c561934e089 \ System.dll' जैसा कुछ है, मुझे नहीं लगता कि एक नया संस्करण जोड़ने से वह संदर्भ टूट जाएगा।
मैक्स टोरो

2
@Hans Passant: "और यह मानने का कोई कारण नहीं है कि कोई कार्यक्रम कभी गलती से गलत असेंबली का संदर्भ देगा" मुझे लगता है कि यहाँ कुंजी है Assembly.LoadWithPartialName, अगर जीएसी पर विधानसभा के 2 संस्करण हैं तो क्या होगा?
मैक्स टोरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.