2009-09-25 4 views
98

मैं MSDN प्रलेखन देख रहा था और मैं अभी भी एक छोटे से वास्तव में क्या LoadFile और LoadFrom का उपयोग करते समय एक विधानसभा लोड हो रहा है के बीच का अंतर है पर उलझन में हूँ। क्या कोई बेहतर वर्णन करने के लिए कोई उदाहरण या समानता प्रदान कर सकता है। एमएसडीएन दस्तावेज ने मुझे और भ्रमित कर दिया। इसके अलावा, ReflectionOnlyLoadFromLoadFrom को छोड़कर यह केवल प्रतिबिंब मोड में विधानसभा लोड करता है कि के रूप में ही है।अंतर है?

चूंकि मेरे नेट अनुभव सबसे बड़ी नहीं है, यहाँ MSDN प्रलेखीकरण LoadFile का उपयोग कर के बारे में कुछ सवाल हैं:

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

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

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

+6

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

+7

यह भी देखें [* अनियंत्रण *] (http://www.codinghorror.com/blog/2005/ 11/avoiding-undocumentation.html) –

+0

@ कोलोनेलपैनिक एमएस कह सकता है कि सबकुछ दस्तावेज है ... लेकिन ज़ीरुउ के एक सहायक कारक के साथ। – Legends

उत्तर

80

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

// 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); 

संपादित: सवाल आप अपने संशोधित प्रश्न में उठाया जवाब देने के लिए, आप निश्चित रूप से Suzanne Cook on Assembly Identity पढ़ना चाहते हैं।

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

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

+1

कोडबेस को पहचान के समान ही है? – Xaisoft

+0

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

+0

यह इसे थोड़ा सा साफ़ करता है, लेकिन LoadFrom का उपयोग करते समय और डिस्कफाइल, पथ 1 और पथ 2 बिंदुओं का उपयोग करते समय पथ 1 और पथ 2 डिस्क पर एक ही असेंबली की विभिन्न प्रतियों को इंगित करता है। पथ 1 और पथ 2 क्या होगा इसका एक उदाहरण क्या है? आपके धैर्य के लिए धन्यवाद। – Xaisoft

50

Suzanne Cook's blog से:

LoadFile बनाम LoadFrom

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

LoadFrom() फ्यूजन के माध्यम से चला जाता है और एक अलग रास्ता में एक और विधानसभा पर पुनः निर्देशित किया जा सकता है लेकिन साथ कि एक ही पहचान है, तो पहले से ही LoadFrom संदर्भ में भरी हुई है।

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

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

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

here देखें।

इसके अलावा एक ही ब्लॉग पर Choosing a Binding Context लेख देखें।

+0

धन्यवाद, मैं ब्लॉग देखता हूं, मैंने एमएसडीएन दस्तावेज के संबंध में कुछ प्रश्नों के साथ अपनी पोस्ट अपडेट की है। – Xaisoft

+0

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

+0

उत्सुक, सुजैन कुक प्रतिबिंब गुरु है :) – Xaisoft

1

.NET के पास अलग-अलग लोड संदर्भ हैं। सुजान कुक उनके बारे में लिखा है यहाँ: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

इस तरह नेट quarantines कि संदर्भ मिश्रित नहीं कर रहे हैं।

5

एक अंतर यह है कि मैं देखा है:

Assembly.LoadFile - सीमित उपयोगकर्ता अधिकार (diffrence principel) के साथ अलग अलग AppDomain में विधानसभा भार। serilization/deserilization जैसे संचालन नहीं किया जा सका।

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

2

ध्यान दें: एक विधानसभा एक गैर 8.3 पथ से एक 8.3 पथ का उपयोग कर भरी हुई है, और फिर करते हैं, वे अलग विधानसभाओं के रूप में देखा जाएगा, भले ही वे एक ही शारीरिक DLL कर रहे हैं।

32

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

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

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

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

+3

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

+1

धन्यवाद, मुझे एक ही समस्या थी। –

0

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

आशा है कि इससे किसी के लिए ऐसा करने में मदद मिलेगी।

-1

प्रलेखन के अनुसार:

LoadFile (स्ट्रिंग): एक विधानसभा फ़ाइल पथ दिया फ़ाइल की सामग्री को लोड करता है।

लोडफ्रॉम (स्ट्रिंग): एक असेंबली लोड करता है जो फ़ाइल फ़ाइल या पथ देता है।