2012-04-15 15 views
8

का संदर्भ देता है मेरा एप्लिकेशन अपने निष्पादन पथ में स्थित सभी लाइब्रेरी असेंबली लोड करता है और निहित कक्षाओं के खिलाफ पूर्व ज्ञात विधियों को निष्पादित करता है।रनिंग समय पर एक असेंबली लोड करें जो कॉलिंग असेंबली

अब मुझे एक ऐसी असेंबली के साथ ऐसा करने की ज़रूरत है जो मेरे आवेदन असेंबली का संदर्भ देता हो। क्या यह संभव है और क्या कोई नकारात्मक प्रभाव है जिसके बारे में मुझे अवगत होना चाहिए?

मास्टर विधानसभा:

public abstract class TaskBase 
{ 
    public abstract void DoWork(); 
} 

LoadAssemblyFromFile("Assembly0001.dll"); 
Assembly0001.Task1.DoWork(); 

बाल सभाओं:

public sealed class Task1: MasterAssembly.TaskBase 
{ 
    public override void DoWork { /* whatever */ } 
} 
+0

मैं इसे बिना किसी समस्या के हर समय करता हूं। एकमात्र गोचा जिसे मैंने चलाया है (वास्तव में कुछ बार) _master_ असेंबली का संस्करण प्रबंधन है। यदि आप बच्चों को पुन: संकलित किए बिना _master_ में परिवर्तन करते हैं तो आप कुछ विचित्र समस्याओं में भाग ले सकते हैं। –

+0

@ एम। बाबाकॉक: धन्यवाद। जिज्ञासा से बाहर, किस तरह की समस्याएं? मैं recompile पर असेंबली संस्करणों को स्वत: वृद्धि नहीं करता हूं। मुझे लगता है कि जो भी मुद्दे आप सामना कर सकते हैं उसे बाईपास करना चाहिए। तुम्हारे विचार? –

+0

मुझे सामना करना सबसे आम समस्या यह है कि एक विधि परिभाषा पिछड़े संगतता को तोड़ने में बदलती है, हालांकि अन्य मामलों में मैंने डरावना अनुभव किया है "_Type_ दोनों _Master_ और _Master_" अपवाद में परिभाषित किया गया है (स्मृति से इसलिए शाब्दिक पाठ नहीं है, लेकिन बंद करें पर्याप्त है कि आप इसे पहचान लेंगे)। –

उत्तर

6

हां, यह संभव है। जब तक आपकी मास्टर असेंबली बाल असेंबली का संदर्भ नहीं देती है, तो आपको ठीक होना चाहिए। अन्यथा, आपके पास एक परिपत्र निर्भरता होगी।

मास्टर असेंबली केवल बाल असेंबली लोड करेगी और उनके बारे में कुछ भी नहीं जानेगी सिवाय इसके कि वे एक इंटरफ़ेस लागू करते हैं। इस तरह, मास्टर असेंबली को बाल असेंबली का संदर्भ देने की आवश्यकता नहीं है।

जहां तक ​​मुझे पता है, कोई गठिया नहीं है। हम कुछ परिदृश्यों के लिए सफलतापूर्वक इस तकनीक का उपयोग करते हैं।

+0

धन्यवाद। संदर्भ के बाहर, डिस्क पर असेंबली फ़ाइल मौजूद होने के बिना स्मृति से असेंबली लोड करने का कोई तरीका है? ये आवधिक असेंबली रिलीज केंद्रीय डेटाबेस में मौजूद हैं और मैं उपयोगकर्ताओं को अपने हाथों पर पहुंचने के लिए उचित रूप से कठिन बनाना चाहता हूं। बेशक, मैं समझता हूं कि इसे हासिल करने के लिए कोई मूर्ख-प्रमाण तरीका नहीं है। –

+0

हां, हमारे पास मोबाइल ऐप थे। असेंबली बाइनरी डेटाबेस में संग्रहीत, पुनर्प्राप्त और उस तरह से लोड किया गया था। आप एक ही काम कर सकते हैं। –

+0

इसे मिला: असेंबली.लोड (बाइट [])। –

1

मेरे अनुभव में वहाँ इस के साथ कुछ भी गलत नहीं है। वास्तव में, MEF इस तकनीक का उपयोग AssemblyCatalog (जहां आपके कार्यान्वयन मास्टर असेंबली में हैं) और DirectoryCatalog (जहां एक इंटरफ़ेस के कार्यान्वयन एक विशिष्ट निर्देशिका में असेंबली में हैं) के रूप में उपयोग करते हैं।

दोनों को बिना किसी समस्या के AggregateCatalog में एक साथ उपयोग किया जा सकता है।

0

केवल "समस्या" है कि आप अपने मास्टर विधानसभा में Assembly0001.Task1 नहीं लिख लेकिन आप भरी हुई विधानसभा में सही काम पा सकते हैं और आह्वान कर सकते हैं कि एक:

var asm = LoadAssemblyFromFile("Assembly0001.dll"); 
var taskType = asm.GetTypes().FirstOrDefault(t => typeof(TaskBase).IsAssignableFrom(t)); 
var task = (TaskBase)Activator.CreateInstance(taskType); 
task.DoWork(); 

तुम अब भी हूँ कुछ अतिरिक्त सुरक्षा जांच जोड़ने की आवश्यकता है :)

+0

हां, ज़ाहिर है। प्रकार के द्वारा रन टाइम इंस्टेंस बनाना इसे हासिल करने का एकमात्र तरीका है। आप किस तरह की सुरक्षा जांच की सिफारिश करेंगे? एप्लिकेशन को यह सुनिश्चित करने की आवश्यकता है कि यह हमारे स्वयं के कोड को निष्पादित कर रहा है (संभवतः एक तरफा हैश के माध्यम से)। और क्या? –

+0

वैसे ज्यादातर सिर्फ शून्य जांच, यदि आप वास्तव में अपने कार्यों को चलाने के लिए एक सैंडबॉक्स बनाना चाहते हैं तो यह थोड़ा और कठिन हो सकता है। – XIU

0

आपने अपने LoadAssemblyFromFile ("...") विधि का कोड पोस्ट नहीं किया है, लेकिन अगर यह असेंबली लोड करने के लिए असेंबली.लोड लोड() या असेंबली.लोडफाइल() का उपयोग करता है, तो आप InvalidCastException, MissingMethodException या अन्य अपवाद प्राप्त कर सकते हैं, खासकर यदि आपका एप्लिकेशन और लोड असेंबली दोनों संदर्भ समान असेंबली। LoadFrom() और LoadFile() आपके आवेदन की तुलना में विभिन्न बाध्यकारी संदर्भ में असेंबली लोड करता है। विस्तृत स्पष्टीकरण के लिए this देखें।

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