2014-04-15 13 views
6

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

प्रकार 'ServerCore.IServerModule' 'ServerCore.dll' और 'दोनों में मौजूद है ServerCore.dll '

मैं लोड प्लगइन्स इस तरह:

foreach (var dll in dlls) 
{ 
      var assembly = Assembly.LoadFrom(dll); 
      var modules = assembly.GetExportedTypes().Where(
       type => (typeof (IServerModule)).IsAssignableFrom(type) 
       && !type.IsAbstract && 
       !type.IsGenericTypeDefinition) 
       .Select(type => (IServerModule)Activator.CreateInstance(type)); 
      result.AddRange(modules); 
} 

मैं कैसे इस मुसीबत से निपटने कर सकते हैं?

मैं किसी भी मदद

+0

आप इस देखा है? http://stackoverflow.com/questions/1057853/the-type-type-exists-in-both-dlls – Halvard

+0

@ हलावार्ड हां, मैं करता हूं। लेकिन मेरे पास अलग-अलग संस्करण नहीं हैं, मुझे लोड से परेशानी है, जो मुझे दो बार समान असेंबली लोड करता है –

+0

क्या यह ** ** एक ही ** असेंबली लोड करता है या क्या यह ** एक समान ** असेंबली को दो बार लोड करता है? – Halvard

उत्तर

0

ठीक है, मेरा समाधान बदसूरत है, लेकिन काम करता है और मैं भविष्य में (शायद) में एमईएफ के लिए आगे बढ़ जाऊंगा। भयानक उत्तरों

के लिए

if(Path.GetFileNameWithoutExtension(dll)==Assembly.GetCallingAssembly().GetName().Name) 
    continue; 

धन्यवाद हर कोई

संपादित करें: अभी के लिए, मैं इस तरह के बात जोड़ा मैं करने के लिए और अधिक सुरुचिपूर्ण समाधान आया था, यहाँ यह है:

var frameworkAssemblies = 
       from file in new DirectoryInfo(frameworkDirectory).GetFiles() 
       where (file.Extension.ToLower() == ".dll" || file.Extension.ToLower() == ".exe") 
       && !AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName().Name).Contains(file.GetFileNameWithoutExtension()) 
       select Assembly.LoadFrom(file.FullName); 
3

निरीक्षण समस्या DLL और उसके निर्भरता के लिए gratefull हो जाएगा। संभावनाएं अच्छी हैं कि यह आपके मुख्य एप्लिकेशन की तुलना में .NET के एक अलग संस्करण से ServerCore.dll में खींच रही है।

यदि आप प्लगइन करना चाहते हैं तो MEF का उपयोग करने की सलाह देते हैं।

+0

नोप का उपयोग करने का प्रयास करें ... मेरी सभी परियोजनाएं नेट 4.5 के साथ बनाई गई हैं। प्लगइन के उदाहरण मिलने के बाद मैं सरल इंजेक्टर का उपयोग करता हूं। एमईएफ मुझे क्या प्रदान कर सकता है? मैं हमेशा यह जानता हूं कि एमईएफ आईओसी-कंटेनर की तरह है, क्या मैं सही हूँ? –

+2

एमईएफ विशेष रूप से प्लगइन के लिए है - यह प्लगइन को कॉन्फ़िगर करने के लिए विशेषताओं का उपयोग करने के लिए असेंबली की लोडिंग और इंटरफ़ेस कार्यान्वयन की खोज करता है। कम से कम सामने वाले पृष्ठ को पढ़ने लायक है। अपने विशिष्ट मुद्दे के लिए, अपने डीएलएल और एप्लिकेशन की जांच करने के लिए ndepend या ILSpy या .NET परावर्तक का उपयोग करें और प्रत्येक के लिए खींचा जा रहा ServiceCore.dll सत्यापित करें। त्रुटि यह है क्योंकि विभिन्न स्थानों से डीएल 2x लोड किया जा रहा है। – Brandon

+1

@AlexVoskresenskiy आम गलतफहमी। एमईएफ आईओसी नहीं है। आईओसी उपकरण में एक प्लग नहीं है। उदाहरण के लिए आपको 'आलसी <टी, टीएमटाडाटा>' कक्षा को देखना चाहिए जो एमईएफ के साथ आता है। – Aron

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