.NET असेंबली के साथ LoadFile और LoadFrom के बीच अंतर?


126

मैं msdn प्रलेखन को देख रहा था और मैं अभी भी इस बात पर थोड़ा उलझन में हूं कि असेंबली को लोड करने LoadFileऔर उपयोग करने के दौरान क्या अंतर है LoadFrom। क्या कोई इसे बेहतर वर्णन करने के लिए एक उदाहरण या सादृश्य प्रदान कर सकता है। MSDN प्रलेखन ने मुझे और भ्रमित कर दिया। इसके अलावा, है ReflectionOnlyLoadFromएक ही रूप में LoadFromसिवाय इसके कि यह विधानसभा केवल प्रतिबिंब मोड में लोड करता है।

चूंकि मेरा .NET अनुभव सबसे बड़ा नहीं है, इसलिए लोडफाइल का उपयोग करते हुए MSDN प्रलेखन के बारे में कुछ प्रश्न यहां दिए गए हैं:

1) LoadFileउन विधानसभाओं की जाँच से क्या मतलब है जिनकी समान पहचान है, लेकिन विभिन्न रास्तों में स्थित हैं? पहचान (उदाहरण) क्या है?

2) यह बताता है कि LoadFileफाइलें 'लोडफ्रॉम संदर्भ' में लोड नहीं होती हैं और लोड पथ का उपयोग करके निर्भरता को हल नहीं करती हैं। इसका क्या मतलब है, क्या कोई उदाहरण दे सकता है?

3) अंत में, यह बताता है कि LoadFileइस सीमित परिदृश्य में उपयोगी है क्योंकि लोडफ्रेम उन विधानसभाओं को लोड नहीं कर सकते जिनकी समान पहचान हैं लेकिन अलग-अलग रास्ते हैं; यह केवल पहली ऐसी असेंबली को लोड करेगा, जो मुझे फिर से एक ही सवाल पर लाता है, विधानसभाओं की पहचान क्या है?


10
सच में मुझे भी कभी-कभी लगता है कि एमएस को बेहतर लेखक या कुछ और चाहिए क्योंकि वाक्य हमेशा समझ में नहीं आते हैं ...
तारिक


1
@ColonelPanic MS कह सकता है कि सब कुछ प्रलेखित है ... लेकिन ज़ेरूओ की मदद से।
महापुरूष

जवाबों:


96

क्या यह स्पष्ट है?

// path1 and path2 point to different copies of the same assembly on disk:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the assembly from path1, so this is true
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

assembly1 = Assembly.LoadFile(path1);
assembly2 = Assembly.LoadFile(path2);

// These point to different assemblies now, so this is false
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

संपादित करें : आपके संशोधित प्रश्न में आपके द्वारा उठाए गए सवालों के जवाब देने के लिए, आप निश्चित रूप से विधानसभा पहचान पर सुजान कुक को पढ़ना चाहते हैं ।

कई नियम हैं जो विधानसभाओं को कैसे लोड करते हैं, और उनमें से कुछ के साथ यह निर्भर करता है कि वे कैसे निर्भरता को हल करते हैं - यदि आपका असेंबली असेंबली पर निर्भर है, तो असेंबली खोजने के लिए .NET कहां दिखना चाहिए? ग्लोबल असेंबली कैश में, वही डायरेक्टरी जिसे असेम्बली मिली, या कहीं और पूरी तरह से? इसके अलावा, यदि यह उस विधानसभा की कई प्रतियाँ पाता है, तो इसे कैसे चुनना चाहिए कि किसका उपयोग करना है?

LoadFromनियमों का एक सेट है, जबकि नियमों LoadFileका एक और सेट है। उपयोग करने के कई कारणों की कल्पना करना कठिन है LoadFile, लेकिन यदि आपको एक ही विधानसभा की विभिन्न प्रतियों पर प्रतिबिंब का उपयोग करने की आवश्यकता है, तो यह आपके लिए है।


2
क्या CodeBase पहचान के समान है?
ज़ैसॉफ्ट

नहीं, मैंने यहां कोडबेस का इस्तेमाल विधानसभा की एक मनमानी संपत्ति के रूप में किया है कि यह स्पष्ट करने के लिए कि दूसरा विधानसभा उदाहरण 'गलत' फ़ाइल (पहले उदाहरण में) की ओर इशारा करता है। मैं अधिक विवरण के साथ अपने उत्तर को अपडेट कर रहा हूं।
जेफ सनातन

1
यह इसे थोड़ा साफ करता है, लेकिन LoadFrom का उपयोग करते समय और LoadFile का उपयोग करते समय path1 और path2 डिस्क पर एक ही विधानसभा की विभिन्न प्रतियों को कैसे इंगित करता है, path1 और path2 अलग-अलग विधानसभाओं को इंगित करता है। पथ 1 और पथ 2 का उदाहरण क्या होगा? आपके धैर्य के लिए धन्यवाद।
ज़ैसॉफ्ट

आप मूल्य समानता के लिए दो स्ट्रिंग संदर्भों की जांच क्यों करते हैं string.Compare(x, y) == 0? मुझे लगता है कि आप x == yवहां चाहते हैं? यदि अस्पष्ट कारणों से आप संस्कृति पर निर्भर समानता की जांच करना चाहते हैं, तो string.Equals(x, y, StringComparison.CurrentCulture)उदाहरण के लिए लिखना अधिक स्पष्ट है ।
जेपी स्टिग नील्सन

@JeffSternal लिंक पर "सुज़ैन कुक ऑन असेंबली आइडेंटिटी" से लगता है कि यहाँ तोड़ दिया जाएगा ...
मार्टिन वेरजन्स

61

से सुजान कुक के ब्लॉग :

लोडफाइल बनाम लोडफ्रेम

सावधान रहें - ये एक ही बात नहीं हैं।

लोडफ्रॉम () फ्यूजन से होकर गुजरता है और एक अलग रास्ते पर दूसरे असेंबली में रीडायरेक्ट किया जा सकता है, लेकिन उसी पहचान के साथ अगर कोई पहले से ही लोडफ्रॉम के संदर्भ में लोड है।

LoadFile () फ़्यूज़न के माध्यम से बिल्कुल नहीं बंधता है - लोडर आगे बढ़ता है और ठीक उसी तरह लोड होता है * जो कॉलर ने अनुरोध किया था। यह लोड या लोडफ्रॉम संदर्भ का उपयोग नहीं करता है।

तो, LoadFrom () आमतौर पर आपको वही देता है जो आपने मांगा था, लेकिन जरूरी नहीं। LoadFile () उन लोगों के लिए है जो वास्तव में, वास्तव में वही चाहते हैं जो अनुरोध किया जाता है। (* हालांकि, v2 में शुरू होने पर, पॉलिसी को लोडफ्रॉम () और लोडफाइल () दोनों पर लागू किया जाएगा, इसलिए लोडफाइल () जरूरी नहीं होगा जो अनुरोध किया गया था। इसके अलावा, v2 में शुरू, अगर इसकी पहचान के साथ एक विधानसभा है। इसके बजाय GAC, GAC प्रति का उपयोग किया जाएगा। आप क्या चाहते हैं - इसे लोड करने के लिए ReflectionOnlyLoadFrom () का उपयोग करें - लेकिन, ध्यान दें कि असेंबलियों को इस तरह से लोड किया जा सकता है।)

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

देख यहाँ

एक ही ब्लॉग पर बाइंडिंग कॉन्टेक्स्ट लेख चुनना भी देखें ।


धन्यवाद, मैं ब्लॉग की जांच करूंगा, मैंने अपनी पोस्ट को msdn प्रलेखन के बारे में कुछ सवालों के साथ अद्यतन किया।
ज़ैसॉफ्ट

@Xaisoft - असेंबली पहचान के जवाब के साथ सुज़ैन कुक का ब्लॉग फिर से बचाव में आता है। ब्लॉगs.msdn.com/suzcook/archive/2003/07/21/57232.aspx देखें । यह अनिवार्य रूप से एक "असेंबली डिस्प्ले नाम" है और यह कुछ इस तरह है: "सिस्टम, संस्करण = 1.0.3300.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089" इसलिए इसमें असेंबली का वास्तविक नाम दोनों शामिल हैं, यह अन्य पहचान जानकारी के साथ संस्करण संख्या भी है (जैसे PublicKeyToken आदि)।
क्रेगटीपी

1
जब वह फ्यूजन के बारे में बात करती है तो वह क्या कहती है?
ज़ैसॉफ्ट

1
दरअसल, जेफ मौके पर हैं। इस लिंक को देखें: grimes.demon.co.uk/workbooks/fusionWS.htm फ्यूजन सब-सिस्टम पर एक अच्छे ट्यूटोरियल के लिए। और यह .NET में असेंबलियों को लोड करने के लिए तकनीक है
CraigTP

1
बस एक त्वरित अद्यतन, ध्यान दें कि ऊपर दिया गया URL (grimes.demon.co.uk/workbooks/fusionWS.htm) अब मान्य नहीं है और अब इसे स्थानांतरित कर दिया गया है: richardgrimes.com/workbooks/fusionWS.htm
क्रेगस

45

बहुत सारे सिर खुजाने के बाद मैंने आज दोपहर खुद ही एक अंतर खोज लिया है।

मैं एक DLL रनटाइम पर लोड करना चाहता था, और DLL किसी अन्य निर्देशिका में रहता था। उस DLL की अपनी निर्भरताएं (DLL) थीं जो उसी निर्देशिका में रहती थीं।

LoadFile (): विशिष्ट DLL लोड किया गया, लेकिन निर्भरता नहीं। इसलिए जब पहली कॉल DLL के भीतर से दूसरे DLL में से किसी एक में की गई तो उसने FileNotFoundException को फेंक दिया।

LoadFrom (): मेरे द्वारा निर्दिष्ट DLL और उस निर्देशिका में रहने वाले सभी निर्भरता को लोड किया गया।


4
यह वास्तव में मेरी समस्या थी! FileNotFoundExceptionजब मैं सिर्फ भरी हुई विधानसभा द्वारा संदर्भित विधानसभा में परिभाषित वस्तु का एक नया उदाहरण बनाते हुए मिल रहा था .LoadFile। इस .LoadFromमुद्दे को ठीक करने के लिए दिखाई दिया, लेकिन मुझे पता नहीं क्यों! धन्यवाद
Connell

1
धन्यवाद, मुझे भी यही समस्या हो रही थी।
Ivandro IG Jao

4

नोट: यदि एक असेंबली को 8.3 पथ का उपयोग करके लोड किया जाता है, और फिर गैर-8.3 पथ से, उन्हें अलग-अलग असेंबली के रूप में देखा जाएगा, भले ही वे एक ही भौतिक DLL हों।



0

एक अंतर जो मैंने देखा है:

असेंबली.लॉडफाइल - सीमित उपयोगकर्ता अधिकारों (डिफरेंस प्रिंसिपल) के साथ अलग-अलग AppDomain में लोड असेंबली। सीरियलाइजेशन / डिसेर्लाइजेशन जैसे ऑपरेशन नहीं किए जा सके।

असेंबली.लॉडफ्रॉम - एक ही उपयोगकर्ता अधिकार (एक ही प्रिंसिपल) के साथ एक ही AppDomain में लोड असेंबली।


3
यह सही नहीं है। आपको क्या विश्वास है कि असेंबली। लॉडफाइल एक असेंबली को दूसरे AppDomain में लोड करता है?
1534 पर fr34kyn01535

0

मेरे मामले में, मुझे बस एएसपी एप्लिकेशन कैश को @ हटा देना था C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files । जब साइट को पहले चलाया जाता है तो इसे फिर से बनाया जाता है। पहले IIS को रोकना सुनिश्चित करें।

आशा है कि यह मेरे जैसे किसी के लिए मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.