2014-05-01 7 views
13

का भार संदर्भ एक भरी हुई Assembly को देखते हुए निर्धारित वहाँ एक रास्ता (कोड में) निर्धारित करने के लिए है जो 3 लोड संदर्भों यह (डिफ़ॉल्ट लोड, LoadFrom, या न तो) में लोड किया गया था?एक विधानसभा

Suzanne Cook's "Choosing a Binding Context" आलेख में, कुछ नुकसान होते हैं जब एक असेंबली लोडफ़्रम में लोड होती है। विशेष रूप से, मेरी लाइब्रेरी deserialization का उपयोग करती है और InvalidCastException का सामना करती है जब लोडफ़्रॉम संदर्भ में लोड किया जाता है।

वर्तमान में मेरी लाइब्रेरी बहुत देर हो चुकी है (यह समस्याग्रस्त deserialization कोड निष्पादित करता है जब यह विफल रहता है - my example देखें)। मैं इन परिस्थितियों में बहुत पहले विफल होना चाहता हूं, जो संदर्भ में लोड हो रहा है और अपवाद फेंक रहा है अगर इसे डिफ़ॉल्ट लोड संदर्भ में लोड नहीं किया गया है।

+0

IMO एक (बहुत ही सुंदर नहीं) समाधान विधानसभा उपवर्ग, पुनर्लेखन लोड तरीकों और जब एक विधि का प्रयोग किया जाता है कस्टम झंडे को जोड़ने के लिए किया जाएगा। – pasty

+1

@pasty लोड विधि का उपयोग किया जाता है, जिसके परिणामस्वरूप असेंबली को किसी विशेष संदर्भ में लोड नहीं किया जाता है। अर्थात। कॉलिंग असेंबली। लोड हमेशा असेंबली को लोड लोड संदर्भ में लोड नहीं करता है। इसके अलावा, मैं असेंबली लोड करने वाले कोड के नियंत्रण में नहीं हूं। –

+0

क्या आपने 'Assembly.होस्टकॉन्टेक्स्ट' संपत्ति के व्यवहार का परीक्षण किया है? यह 'लंबा' प्रकार का है। मैंने JustDecompile का उपयोग करके उस संपत्ति में देखा, लेकिन मुझे अभी भी कोई संकेत नहीं है कि इसका मूल्य उन 3 श्रेणियों में कैसे मैप कर सकता है। –

उत्तर

3

असेंबली के संदर्भ की पहचान करने के बजाय, आप इसके व्यवहार का परीक्षण कर सकते हैं। उदाहरण के लिए, क्रमबद्ध करने के लिए, सीरिएलाइज़र असेंबली को कॉल करेगा। लोड और उस असेंबली को मिलान ऑब्जेक्ट की धारावाहिक की असेंबली होना चाहिए। कोडबेस की जांच करके एक मैच का परीक्षण किया जा सकता है।

private static bool DoesAssemblyMatchLoad(Assembly assemblyToTest) 
{ 
    try 
    { 
     var loadedAssembly = Assembly.Load(assemblyToTest.FullName); 
     return assemblyToTest.CodeBase == loadedAssembly.CodeBase; 
    } 
    catch (FileNotFoundException) 
    { 
     return false; 
    } 
} 
+0

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

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