2010-10-15 12 views
6

मेरे पास एक वीएस एड-इन है जो किसी ऑब्जेक्ट को deserialize करने के लिए एक बाइनरीफॉर्मेटर का उपयोग कर रहा है। इस ऑब्जेक्ट के प्रकार को हल करने के लिए, यह असेंबली कॉल कर रहा है। लोड (ऑब्जेक्ट टाइप टाइप करें) लेकिन यह अपवाद ट्रिगर कर रहा है क्योंकि असेंबली.लोड किसी भी स्थान पर असेंबली नहीं ढूंढ सकता है। दी गई असेंबली ऐड-इन असेंबली के लिए भाई है, लेकिन ऐसा लगता है कि असेंबली। लोड() इसे वहां नहीं ढूंढ सकता है।यह निर्धारित करने के लिए कि असेंबली के लिए विधानसभा.लोड() कहां खोजें?

एक संभावित समाधान यह निर्धारित करना होगा कि विधानसभा। लोड को असेंबली के लिए देखना चाहिए।

मुझे क्या करना चाहिए?

पीएस: मैं इस असेंबली को जीएसी पर नहीं डालने की कोशिश कर रहा हूं क्योंकि जब भी मैं असेंबली को पुन: संकलित करता हूं तो मुझे इसे अपडेट करने की आवश्यकता होगी।

उत्तर

4

आप अतिरिक्त निजी खोज पथ जोड़ने के लिए AppDomainSetup.PrivateBinPath का उपयोग कर सकते हैं। इसे AppDomain.SetupInformation के माध्यम से पुनर्प्राप्त किया जा सकता है।

एक अन्य विकल्प व्यवहार को ओवरराइड करने के लिए AppDomain.AssemblyResolve की सदस्यता लेना है जब यह आपकी असेंबली को ढूंढने में विफल रहता है।

+0

धन्यवाद रीड। कुछ नोट्स: भले ही AppDomain.AppendPrivatePath को AppDomainSetup.PrivateBinPath के पक्ष में बहिष्कृत किया गया है, मैं केवल पहले का उपयोग कर सकता था। AppDomainSetup.PrivateBinPath इसे बदलने के बाद शून्य बना रहता है। AppDomain.AppendPrivatePath मुझे किसी भी पथ को जोड़ने की सुविधा देता है जो AppDomain.BaseDirectory का एक बच्चा है, जो कई मामलों में पर्याप्त है, मेरे में नहीं, क्योंकि मेरा बेस डायरेक्टरी डेवीएनवी निर्देशिका है। दूसरा समाधान, AppDomain.AssemblyResolve काफी अच्छा है। नोट्स: ईवेंट केवल तभी बुलाया जाता है जब .NET स्वयं के लिए असेंबली को हल नहीं कर सकता है। यदि सभी हैंडलर शून्य लौटते हैं, तो एक अपवाद –

3

यदि आप यह निर्धारित करने की कोशिश कर रहे हैं कि असेंबली लोडर आपके डीएलएल को लोड करने का प्रयास कर रहा है, तो मैं अनुशंसा करता हूं कि आप फ़्यूज़न लॉग चालू करें। ऐसा करने से आप आउटपुट प्राप्त कर सकेंगे जो आपको प्रत्येक पथ को दिखाएगा जो संबंधित डीएल के लिए चेक किया गया था।

फ़्यूज़न लॉग को कॉन्फ़िगर करने के तरीके पर MSDN article और लोडिंग विफलताओं को डीबग करने के तरीके पर Suzanne Cook द्वारा उपयोगी लेख पर एक उपयोगी आलेख है। यदि आप चालू करते हैं और आपको केवल उन असेंबली के लिए आउटपुट प्राप्त करना चाहिए जो लोड होने में विफल रहे।

+0

फेंक दिया जाता है यह संलयन लॉग बहुत दिलचस्प है, मैं लेख पढ़ रहा हूं। धन्यवाद। –

4

यहाँ एक कोड दिखा कैसे AssemblyResolve (प्रति रीड Copey के जवाब के रूप में) अपने विधानसभा को हल करने के लिए इस्तेमाल किया जा सकता है टुकड़ा है:

// register to listen to all assembly resolving attempts: 
AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 


// Check whether the desired assembly is already loaded 
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) { 
    string desiredAssmebly = args.Name; 
    if (desiredAssembly.Equals("NameUsedToLoadMyAssembly")){ 
     return Assembly.LoadFrom(myAssemblyPath); 
    } 

    return null; 
    } 

इसके अलावा, ध्यान दें कि AssemblyResolve के लिए MSDN पेज कहा गया है कि:

.NET Framework संस्करण 4 के साथ शुरुआत, ResolveEventArgs.RequestingAssembly संपत्ति असेंबली देता है ने असेंबली लोड का अनुरोध किया जो हल नहीं किया जा सकता है ...

यदि आप अनुरोध असेंबली के सापेक्ष आपकी असेंबली के स्थान को जानते हैं तो इसका उपयोग किया जा सकता है।

+0

हर्षी, धन्यवाद +1। वास्तव में आपका समाधान मैंने उपयोग किया है, और मैं आपके स्निपेट का उपयोग कर समाप्त हुआ। मैंने रीड के जवाब को स्वीकार्य के रूप में चिह्नित किया क्योंकि यह अधिक पूर्ण है। वैसे भी धन्यवाद। –

संबंधित मुद्दे