2009-10-02 18 views
7

रनटाइम पर, यदि एक संदर्भित असेंबली उदाहरण के साथ लोड करने में विफल रहता है "मजबूत नाम सत्यापन विफल रहा" (क्योंकि यह परीक्षण-हस्ताक्षरित है), क्या कोई अन्य पथ से प्रतिस्थापन असेंबली प्रदान करने का कोई तरीका है जो वास्तविक हस्ताक्षरित है?लोड किए जा सकने वाले व्यक्ति की बजाय फ़ॉलबैक असेंबली कैसे प्रदान करें?

मैंने AppDomain.CurrentDomain.AssemblyResolve की सदस्यता लेने का प्रयास किया, लेकिन इसे निकाल दिया नहीं गया है, क्योंकि "खराब" असेंबली तकनीकी रूप से मौजूद है, इसे बस लोड नहीं किया जा सकता है।

क्या असेंबली लोड नहीं होने पर फॉलबैक असेंबली प्रदान करने का एक सामान्य तरीका है?

+0

आप SecurityException पकड़ने की कोशिश कर सकते हैं जब विधानसभा लोड करने का प्रयास? –

+0

मैंने कोशिश की है कि, लेकिन मैं आगे क्या ... मैं अभी भी किसी भी तरह जब मेरे विधानसभा ... –

+1

के बारे में स्पष्ट रूप से पर विधानसभा लोड करने का प्रयास क्या लोड हो रहा है सही निर्भरता लेने के लिए CLR विधानसभा लोडर बताने की आवश्यकता करने के लिए पता नहीं है एप्लिकेशन स्टार्टअप और अपवाद संभाल लें। मैं किसी भी तरह मानता हूं कि आपकी असेंबली स्वचालित रूप से लोड हो जाती है। – Rashack

उत्तर

1

में लोड किया जाता मुझे लगता है कि तुम सिर्फ व्यावहारिक रूप से कोई सुरक्षा जांच के साथ अपनी पसंद के विधानसभा लोड करने के लिए Assembly.LoadFrom कॉल कर सकते हैं पर निर्भर करता है प्रकार संकल्प में सूक्ष्म अंतर है। हम अपने ऐप की शुरुआत में यह बहुत कुछ करते हैं ताकि हम अन्य असेंबली संस्करण परिवर्तन के साथ बेहतर तरीके से निपट सकें।

Assembly.LoadFrom Method (String, Evidence, Byte[], AssemblyHashAlgorithm) पर भी देखें कि आप हैश के साथ-साथ हैश एल्गोरिदम में गुजरने पर नियंत्रण कर सकते हैं।

+0

धन्यवाद मैं सिर्फ इतना है कि कोशिश की और यह मुझे देता है एक ही "सशक्त नाम सत्यापन में विफल" हालांकि मैं यह सही विधानसभा को इंगित: वर AssemblyName = AssemblyName .GetAssemblyName (correctFileName); वर विधानसभा = Assembly.Load (AssemblyName);। मैं सोच रहा हूँ इस वजह से correctFileName एप्लिकेशन codebase फ़ोल्डर के बाहर है मुझे लगता है कि मैं सिर्फ इसे छोड़ और एक अलग रास्ता जाता हूँ ...लोड के साथ –

+0

आप फ़ाइल पथ पास करते हैं और आप किसी भी स्थान से (असेंबली) लोड कर सकते हैं। –

+0

यूप, लोडफ्रॉम मुझे यह पिछले लग रहा था। मैंने बाद में अन्य समस्याओं को मारा है, इसलिए मैंने पूरे दृष्टिकोण को तोड़ दिया है, लेकिन हाँ, यह समस्या हल हो गई है। लोड विफलताओं का जवाब देने के बजाय असेंबली प्रीलोड करें। धन्यवाद! –

1

लोड प्रयास को किस प्रकार ट्रिगर करता है? क्या आप असेंबली को कॉल करते हैं। लोड या यह रिज़ॉल्यूशन प्रयास का नतीजा है? यदि यह उत्तरार्द्ध है तो आप AppDomain TypeResolve ईवेंट के साथ खेलने का प्रयास कर सकते हैं, यदि पूर्व - आप असेंबली में अपने कॉल में अतिरिक्त तर्क जोड़ सकते हैं। लोड।

यदि आप मैन्युअल रूप से असेंबली लोड करते हैं, तो सुनिश्चित करें कि आप इसे असेंबली के साथ लोड करते हैं। लोड - असेंबली नहीं। लोड से। वहाँ किस संदर्भ विधानसभा

+0

मैं असेंबली का उपयोग नहीं करता हूं। लोड - प्रश्न में असेंबली संकलक द्वारा जुड़ा हुआ है। जब भी मैं विधानसभा का उपयोग शुरू - मैं typeof फोन (TypeInAssembly) .GetTypes() - यह पहला विधानसभा और रिकर्सिवली अपने अहस्ताक्षरित संदर्भित विधानसभा लोड करता है। ।। TypeResolve उठाया है नहीं मिल या तो :( धन्यवाद वैसे भी –

0

ऐसा लगता है कि मैं क्या चाहता हूं असंभव है। मैंने एक और रास्ता तय करने का फैसला किया। संकलन समय पर परीक्षण-हस्ताक्षरित बाइनरी के बजाय हमें हस्ताक्षरित बाइनरी से सशर्त रूप से लिंक करने के लिए बिल्ड सिस्टम को संशोधित करना होगा।

धन्यवाद सुझाव हालांकि हर किसी के लिए!

0

वहाँ एक विधानसभा मामले में आवेदन ऐसा करने के लिए विफल रहता है खोजने के लिए एक मानक तरीका है:

// register on assembly resolve exception 
AppDomain.CurrentDomain.AssemblyResolve += ResolveEventHandler; 

// try to load the assembly yourself 
private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args) 
{ 
    return Assembly.Load(some_location); 
}