2010-04-28 21 views
11

यहाँ सेटअप है। कक्षा पुस्तकालय एक प्लगइन के रूप में कार्य करता है। इस प्लगइन लोड का अपना छोटा बच्चा प्लगइन्स (सभी DotNet कक्षा पुस्तकालय), और यहहल विधानसभाओं, फजी रास्ता

Assembly asm = Assembly.Load(COFF_Image); 

एक बाइट-धारा के रूप में स्मृति में dll पढ़ने, तो समस्या पैदा होती है उन छोटे बच्चे प्लगइन्स संदर्भ हो जब से ऐसा नहीं करता है अन्य डीएलएस के लिए। चूंकि वे डिस्क से सीधे स्मृति के माध्यम से लोड होते हैं, इसलिए ढांचे को अक्सर इन संदर्भित असेंबली नहीं मिलती हैं और इस प्रकार उन्हें लोड करने में असमर्थ है।

मैं अपने प्रोजेक्ट में एक असेंबली रीसोल्वर हैंडलर जोड़ सकता हूं और मैं इन संदर्भित असेंबली को पिछले छोड़ सकता हूं। मेरे पास डिस्क पर इन संदर्भित असेंबली कहां मिलें, इस बारे में मुझे एक अच्छा विचार है, लेकिन मैं यह कैसे सुनिश्चित कर सकता हूं कि Assmebly I लोड सही है?

संक्षेप में, मैं विश्वसनीय रूप से सिस्टम से कैसे जा सकता हूं। ResolveEventArgs.Name फ़ील्ड को एक डीएलएल फ़ाइल पथ पर, मान लीजिए कि मेरे पास सभी फ़ोल्डर्स की एक सूची है जहां यह डीएल छुपाया जा सकता है)?

उत्तर

6

जब मैंने अतीत में इसका उपयोग किया है तो हमने अभी भी फ़ाइल नाम की तुलना ResolveEventArgs.Name के नाम से की है जिसका नाम है। यदि आप यह सुनिश्चित करना चाहते हैं कि आप एक ही संस्करण को लोड कर रहे हैं, तो मुझे लगता है कि आप यह जांच सकते हैं कि नाम मिलान करते हैं या नहीं, अगर वे असेंबली लोड करते हैं और फिर ResolveEventArgs.Name के खिलाफ असेंबली पूर्ण नाम की जांच करते हैं।

इन पंक्तियों के साथ

कुछ:

string name = GetAssemblyName (args); //gets just the name part of the assembly name 
foreach (string searchDirectory in m_searchDirectories) 
    { 
    string assemblyPath = Path.Combine (executingAssemblyPath, searchDirectory); 
    assemblyPath = Path.Combine (assemblyPath, name + ".dll");   
    if (File.Exists (assemblyPath)) 
     {    
     Assembly assembly = Assembly.LoadFrom (assemblyPath); 
     if (assembly.FullName == args.Name) 
      return assembly; 
     } 
    } 
संपूर्णता के लिए

:

private string GetAssemblyName (ResolveEventArgs args) 
    { 
    String name; 
    if (args.Name.IndexOf (",") > -1) 
     { 
     name = args.Name.Substring (0, args.Name.IndexOf (",")); 
     } 
    else 
     { 
     name = args.Name; 
     } 
    return name; 
    } 
+0

सैम, यह थोड़ा अपर्याप्त नहीं है, जिसमें यह वांछित रूप से असेंबली लोड करता है जब तक कि यह सही न हो? –

+2

यह केवल उन डीएलएस को लोड करता है जिनके पास असेंबली के समान नाम है जिसे हम हल करने का प्रयास कर रहे हैं। जो मैंने किया है, इसका मतलब है कि यह केवल 1 डीएल लोड करता है, लेकिन यदि डीएल और असेंबली के पास समान नाम नहीं हैं तो आपको प्रत्येक डीएलएल लोड करना होगा और जिस नाम को आप ढूंढ रहे हैं उसके खिलाफ असेंबली नाम जांचना होगा। –

+0

और मुझे लगता है कि मेरे ऐपडोमेन को प्रदूषित करने से रोकने का एकमात्र तरीका एक और ऐपडोमेन बनाना है और उन्हें पहले लोड करना है? –

1

मैंने कभी असेंबली रीसोलवर के साथ भाग्य नहीं लिया है। मैं आमतौर पर इन तीनों में से एक करता हूं:

  1. प्लगइन की आवश्यकता नहीं है बाहरी संदर्भ जो जीएसी में नहीं हैं। अगर वे कुचलना चाहते हैं, तो उन्हें ILMerge पर बताएं।
  2. प्लगइन को अपने सभी डीएलएस को एक ज्ञात प्लगइन निर्देशिका में डंप करने की आवश्यकता है। उस निर्देशिका में सभी असेंबली को स्मृति में लोड करें।
  3. फ़्यूलर द्वारा जांच की गई पथ में प्लगइन निर्भरता मौजूद है। आप यह पता लगा सकते हैं कि बाइंडर असेंबली की तलाश में है, फ़्यूज़न लॉग चालू करें (fuslogvw.exe - लॉगिंग चालू करने के बाद रीबूट करना न भूलें!)।
2

Managed Extensibility Framework (MEF) कुछ है कि आपके सभी समस्याओं का समाधान करेंगे जैसा लगता है। यह डीएलएल का पता लगाने के लिए फ़ोल्डरों को स्कैन कर सकता है, किसी भी गहराई के लिए निर्भरता को हल कर सकता है और सामान्य रूप से प्लग-इन संरचना का प्रबंधन करता है। प्रत्येक भाग (या 'प्लग-इन') को केवल यह घोषित करना पड़ता है कि इसकी क्या ज़रूरत है और यह क्या प्रदान करता है, और एमईएफ तारों का ख्याल रखता है। यदि एमईएफ वीएस -2010 के एक्स्टेंसिबिलिटी जानवर को टम करने में सफल रहा, तो यह कुछ भी संभाल सकता है।

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