2011-12-15 4 views
10

मेरे पास एक प्रोजेक्ट है जो कई प्रोजेक्ट लाइब्रेरीज़ का उपयोग करता है जो मेरी परियोजना का हिस्सा हैं, पहले असेंबलीए लोड हो गया है, फिर असेंबलीबी लोड हो गया है। AssemblyA में कोड है कि जब AssemblyA ऐसा करने की कोशिश करता है करता है निम्नलिखितवर्तमान डोमेन में असेंबली लोड को मजबूर करने का एक सही तरीका

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
var assemblyB = assemblies 
       .Where(x=>x.GetName() == "AssemblyB") 
       .First(); 
var type = assemblyB.GetType("AssemblyB_Type"); 

दुर्भाग्य है, AssemblyB CurrentDomain में अभी तक लोड नहीं है, तो यह है कि विधानसभा लोड करने के लिए मैं निम्नलिखित अनावश्यक बात कर रहा हूँ:

var x = typeof(AssemblyB.AssemblyB_Type); 

कंपाइलर चेतावनी दिखाता है कि इस लाइन की आवश्यकता नहीं है, हालांकि मुझे यह समझाने के लिए शब्दों को नहीं मिल रहा है कि अन्यथा यह काम नहीं करेगा, इसलिए सवाल होगा, आप कैसे सही तरीके से (फेंग शुई शब्दों में) बल विधानसभा में अतिरिक्त-अनुपयोगी नलसाजी के बिना CurrentDomain में लोड

+1

आप तो मांग पर एक विधानसभा लोड करने के लिए चाहते हैं, बस Assembly.Load का उपयोग()। या सीएलआर को स्वचालित रूप से असेंबली लोड करने के लिए var type = typeof (नेमस्पेसनाम इनएस्परब्स बी। एस्परब्स बीबी टाइप) का उपयोग करें। –

+0

मुझे लगता है कि मैं थोड़ा उलझन में हूँ। यदि आप टाइपऑफ (असेंबली बी। एस्परब्स बीबी टाइप) करने में सक्षम हैं, तो आपको असेंबली बी। गेट टाइप ("असेंबलीबीटी टाइप") क्यों करना है? –

+1

एक तीसरी पार्टी जेआईएनटी लाइब्रेरी (जावास्क्रिप्ट इंटरप्रिटर) है। यह जावास्क्रिप्ट स्रोत के भीतर से सीएलआर प्रकार बाध्यकारी की अनुमति देता है। सबसे पहले यह AppDomain.CurrentDomain.GetAssemblies() का उपयोग करता है और फिर यह उस असेंबली में उचित प्रकार का पता लगाने का प्रयास करता है, अगर मेरी असेंबली सी # कोड से छूटी नहीं है, तो यह CurrentDomain पर लोड नहीं है और जावास्क्रिप्ट से पहुंच योग्य नहीं है ... – Lu4

उत्तर

8

आपका मौजूदा कोड ऐसा करने का सबसे अच्छा तरीका है (AFAIK)।

चेतावनी से छुटकारा पाने के लिए,

typeof(AssemblyB.AssemblyB_Type).ToString(); 
+0

यह एक दयालुता है :(भयानक लग रहा है ... – Lu4

3

के लिए इसे बदल आपके संदर्भित विधानसभाओं सही ढंग से तैनात किया गया है, तो वे "सिर्फ लोड" चाहिए अगर आप अपने प्रकारों में से एक कहते हैं। .NET ढांचे को आपके लिए इसका ख्याल रखना चाहिए।

यहाँ एक अच्छा लेख तरीका समझा है अपने संदर्भित विधानसभाओं के लिए रूपरेखा खोज: http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

मैं उत्सुक आप क्या कर रहे है कि आप इस तरह समय से पहले ही एक विधानसभा लोड करने के लिए की जरूरत है?

आपके प्रत्यक्ष प्रश्न का उत्तर देने के लिए एक हैक विधानसभा का उपयोग करना है। लोड (स्ट्रिंग स्थान) - हालांकि मैं इसे पूरी तरह से जरूरी होने तक इसे हतोत्साहित करता हूं। http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

+0

एक तीसरी पार्टी जेआईएनटी लाइब्रेरी (जावास्क्रिप्ट इंटरप्रिटर) है। यह जावास्क्रिप्ट स्रोत के भीतर से सीएलआर प्रकारों को बाध्य करने की अनुमति देता है। सबसे पहले यह 'AppDomain.CurrentDomain.GetAssemblies()' का उपयोग करता है और फिर यह पता लगाने की कोशिश करता है उस असेंबली में उपयुक्त प्रकार, अगर मेरी असेंबली सी # कोड से छूटी नहीं है, तो यह CurrentDomain तक लोड नहीं है और जावास्क्रिप्ट से पहुंच योग्य नहीं है ... – Lu4

+0

गोटो। मेरे सिर पर कुछ भी नहीं कूदता - इसे ठीक करने के लिए एक अच्छा गतिशील तरीका AppDomain.CurrentDomain.GetAssemblies() को गिनना होगा, और उन सभी असेंबली को संदर्भित करना होगा। इससे स्मृति और स्टार्टअप प्रदर्शन समस्याएं हो सकती हैं - लेकिन मुझे लगता है कि यह ठीक होना चाहिए। "विधानसभा.जीटर eferencedAssemblies() "http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies।एएसपीएक्स – Dlongnecker

+0

कुछ अजीब लगता है हालांकि, मुझे लगता है कि एक बेहतर समाधान है लेकिन इसमें JInt में परिवर्तन शामिल हो सकते हैं .... – Dlongnecker

1

तो, आप ऐप डोमेन में अपनी बिन निर्देशिका में सभी असेंबली लोड कर सकते हैं। इससे आपकी समस्या का समाधान हो जाना चाहिए।

var assemblies = Directory.GetFiles(containingDirectory, "*.dll")' 

foreach (var assembly in assemblies) 
{ 
    Assembly.Load(AssemblyName.GetAssemblyName(assembly)); 
} 
+0

यह केवल तभी काम करता है जब आप अनुमान लगाते हैं कि यह कहां से चल रहा है। उदाहरण के लिए, यह तब काम नहीं करेगा जब आपका कोड आईआईएस या यूनिट टेस्ट रनर जैसे किसी भिन्न होस्ट में चल रहा हो। – nathanchere

1

यह मैं क्या कर रहा है:

public static class TypeExtensions { 
    public static void EnsureAssemblyLoads(this Type pType) { 
     // do nothing 
    } 
} 

... 

typeof(SomeType).EnsureAssemblyLoads(); 
संबंधित मुद्दे