2011-02-17 10 views
7

मेरे पास एक ऐसा प्रोग्राम है जिसे अपने होस्ट पर प्लगइन डीएलएल खोजने की जरूरत है।एक विशेष इंटरफेस के साथ .NET असेंबली के लिए डीएलएल स्कैनिंग - कुछ डीएलएल R6034 फेंक देते हैं!

यह सभी डीएलएल को एक (काफी बड़े) पथ के भीतर समझाकर करता है। इस पथ में देशी डीएलएल समेत कई चीजें शामिल हैं।

foreach (var f in Directory.EnumerateFiles(@"c:\Program Files", "*.dll", SearchOption.AllDirectories)) 
{ 
    try 
    { 
     var assembly = Assembly.LoadFile(f); 
     var types = assembly.GetTypes(); 
     foreach (var type in types) 
     { 
      if (type.GetInterface("My.IInterface") != null) 
      { 
       plugins.Add(f); 
       break; 
      } 
     } 
     assembly = null; 
    } 
    catch (Exception e) 
    { 
    } 
} 

मेरी स्कैनर एक एमएस क्रम DLL (उदाहरण के लिए, msvcm80.dll) मैं एक uncatchable रनटाइम त्रुटि R6034 प्राप्त मारता है: "। एक आवेदन गलत तरीके से सी क्रम लाइब्रेरी लोड करने की कोशिश की है" यह विंडो प्रोग्राम के निष्पादन को अवरुद्ध करती है। मैं यह डीएलएल नहीं चाहता (जाहिर है); क्या इस स्थिति से एक ग़लत त्रुटि प्राप्त करने का कोई तरीका है?

[संबंधित क्ष: वहाँ अगर एक DLL, एक .NET विधानसभा या नहीं है अगर है कि DLL वर्तमान प्रक्रिया अंतरिक्ष में लोड नहीं है का निर्धारण करने के लिए एक कुशल (जैसे गैर अपवाद) तरीका है]

उत्तर

10

सबसे पहले प्रतिबिंब-लोड लोड Assembly.ReflectionOnlyLoadFrom के साथ करें। असेंबली में प्लगइन ढूंढने के बाद ही आपको Assembly.LoadFrom के साथ इसे पूरी तरह से लोड करना चाहिए।

अपने अन्य प्रश्न का उत्तर देने के लिए, आप जांच सकते हैं कि फ़ाइल में सीएलआर हैडर है या नहीं।

See this post "Read CLR Header" on m.p.dotnet.framework

एक साथ इन आप जबकि प्लगइन्स के लिए खोज किसी भी अपवाद और त्रुटि messageboxes से बचने देना चाहिए।

+1

ReflectionOnlyLoadFrom पर दिलचस्प। बहुत बुरा यह एपडोमेन में किसी दिए गए नाम की एक असेंबली को लोड करने की समान सीमाएं है। और वैकल्पिक ऐपडोमेन का उपयोग करना असाधारण रूप से दर्दनाक है; मैं किसी ऐसे व्यक्ति को नहीं ढूंढ पाया जिसने सफलतापूर्वक वर्णन किया कि कैसे एक और ऐपडोमेन लेना है, सफलतापूर्वक असेंबली लोड करना (विशिष्ट प्रकारों को निर्देशित किए बिना), और फिर उन असेंबली के गुणों से पूछताछ करना। Bleah। – Joe

2

Doesn \ प्रोग्राम फ़ाइलों पर एक अच्छा विचार नहीं लग रहा है ... क्या कोई वहां दुर्भावनापूर्ण DLL डाल सकता है?

क्या आपने MEF का उपयोग करने पर देखा है? यह थोड़ा सुरक्षित भी हो सकता है।

एक निर्देशिकासूची है जो आपके लिए असेंबली स्वचालित रूप से लोड करेगी और आपको अपने इंटरफ़ेस की एक सरणी वापस कर देगी।

सुनिश्चित नहीं है कि आप निर्भरता इंजेक्शन या (आईओसी) नियंत्रण में उलझन में हैं, लेकिन आप इसके लिए एमईएफ का भी उपयोग कर सकते हैं।

यह .NET 4.0 में शामिल है।

+0

दिलचस्प। धन्यवाद, धन्यवाद। – Joe

+2

ठीक है, यह हास्यास्पद है। एमईएफ एक ही समस्या प्रदर्शित करता है। यदि आप वीई ++ रनटाइम लाइब्रेरी वाली निर्देशिका पर निर्देशिकासूची का उपयोग करने के लिए MEF को बताते हैं, तो आपको वही R6034 पॉपअप विंडो मिलती है। (साथ ही, DirectoryCatalog निर्देशिका रिकर्सन का समर्थन नहीं करता है, इसलिए आपको अपनी इच्छित सभी निर्देशिकाओं को गिनना होगा।) मुझे एमईएफ अमूर्तता पसंद है, लेकिन दुर्भाग्यवश यह समस्या हल नहीं करती है। – Joe

+0

क्या आप जानते हैं कि; 1) एमईएफ दिए गए कैटलॉग से सभी असेंबली लोड करता है और फिर दिए गए प्रकार फ़िल्टर करता है या 2) यह असेंबली को कॉल करता है। रिफ्लेक्शनऑनली लोड विधि, फ़िल्टर और फिर लोड करता है? –

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