%windir%\Microsoft.NET\assembly\
नया GAC है । क्या इसका मतलब है कि अब हमें दो GAC को प्रबंधित करना होगा, एक .NET 2.0-3.5 अनुप्रयोगों के लिए और दूसरा .NET 4.0 अनुप्रयोगों के लिए?
सवाल है, क्यों?
%windir%\Microsoft.NET\assembly\
नया GAC है । क्या इसका मतलब है कि अब हमें दो GAC को प्रबंधित करना होगा, एक .NET 2.0-3.5 अनुप्रयोगों के लिए और दूसरा .NET 4.0 अनुप्रयोगों के लिए?
सवाल है, क्यों?
जवाबों:
हां, चूंकि 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 का उपयोग कर सकते हैं।
मैं यह भी जानना चाहता था कि 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% \ असेंबली के तहत हैं। दुर्भाग्य से, यह इस रिलीज के लिए एक विकल्प नहीं था।
आशा है कि यह भविष्य के पाठकों की मदद करता है।
यह बहुत मायने नहीं रखता है, मूल जीएसी पहले से ही असेंबली के विभिन्न संस्करणों को संग्रहीत करने में काफी सक्षम था। और यह मानने का कोई कारण नहीं है कि कोई प्रोग्राम कभी गलती से गलत असेंबली का संदर्भ देगा, सभी .NET 4 असेंबली को [असेंबली वर्जन] 4.0.0.0 तक बंप किया गया। नए इन-प्रोसेस साइड-बाय-साइड फीचर को इसे नहीं बदलना चाहिए।
मेरा अनुमान है: वहाँ पहले से ही बहुत सारे .NET प्रोजेक्ट्स थे जो "जीएसी में कुछ भी कभी भी संदर्भ नहीं" नियम को तोड़ते थे। मैंने इसे इस साइट पर कई बार देखा है।
उन परियोजनाओं को तोड़ने से बचने का केवल एक ही तरीका है: जीएसी को स्थानांतरित करें। Microsoft पर बैक-कमिटर्स पवित्र हैं।
Assembly.LoadWithPartialName
, अगर जीएसी पर विधानसभा के 2 संस्करण हैं तो क्या होगा?