2012-01-14 35 views
5

का उपयोग करके एक ही असेंबली के विभिन्न संस्करणों में कक्षा ऑब्जेक्ट का उपयोग करें। मुझे अलग-अलग संस्करण की असेंबली लोड करने की आवश्यकता है (मेरे पास पहले से ही मेरे आवेदन में समान नाम वाला असेंबली है)।प्रतिबिंब

मैं असेंबली लोड करने और विधि को लोड करने में सक्षम था जिसकी मुझे प्रतिबिंब का उपयोग करके आमंत्रित करने की आवश्यकता थी, लेकिन जब मैं अपनी कक्षा वस्तु को तर्क के रूप में पास करके विधि का आह्वान करने के लिए जाता हूं, तो मुझे अपवाद मिला कि कक्षा वस्तु को प्रकार में परिवर्तित नहीं किया जा सकता तर्क पैरामीटर का।

नमूना कोड -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

यहाँ पैरामीटर एक वर्ग जो मैं विधानसभा में लेकिन जब से पैरामीटर वर्ग वर्तमान संस्करण की विधानसभा में बन जाता है है की एक वस्तु है। और जब मैं इसे पिछले असेंबली की विधि में पास करने का प्रयास करता हूं, तो मुझे एक अपवाद मिला कि इसे परिवर्तित नहीं किया जा सकता है।

मैं इसे कैसे प्राप्त कर सकता हूं? अगर मुझे यहां कुछ और जानकारी डालना है तो मुझे बताएं। अग्रिम में धन्यवाद।

+0

मैं गलत हो सकता हूं, लेकिन जहां तक ​​मैं समझता हूं, असेंबली के एक अलग संस्करण को लोड करने के लिए एक और ऐप डोमेन की आवश्यकता होती है। अन्यथा, पहले से लोड संस्करण का उपयोग किया जाएगा। – Vlad

+0

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

+0

[संभावित असेंबली संस्करणों में उत्तीर्ण कक्षा वस्तुओं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/8871079/passing-class -बोजेक्ट्स-से-अलग-असेंबली-संस्करण) –

उत्तर

2

आपको प्रबंधित एक्सटेंसिबिलिटी फ्रेमवर्क (एमईएफ) देखना चाहिए। यह ऐसा करता है जो आप करना चाहते हैं और ऐपडोमेन्स और विभिन्न असेंबली के बारे में चिंता करने से आपको दूर करना चाहते हैं।

संपादित करें:

आप केवल प्राप्त करने के लिए आप क्या चाहते हैं प्रतिबिंब का उपयोग करना चाहते हैं, तो यह आपके आवेदन के भीतर एक लचीला ऑब्जेक्ट मॉडल की आवश्यकता होती है जाएगा। इस दृष्टिकोण की मूल बातें एमईएफ की तरह हुड के नीचे होती है। जहां आपको वास्तव में ऐसा करने की शक्ति मिलती है, नेट रीमोटिंग से है, तो मैं सुझाव दूंगा कि आप उस पर पढ़ लें।

तुम क्या आवश्यकता होगी:

  • (विधानसभा ए) में आपका आवेदन।

  • पुरानी कक्षा कोड (असेंबली सी) के साथ असेंबली।

  • एक रिमोट लोडर क्लास जो आपके एपडोमेन के लिए प्रॉक्सी/रिमोट के रूप में कार्य करेगी।

  • एक प्रॉक्सी क्लास जो कक्षा के पुराने संस्करण के उदाहरण का प्रतिनिधित्व करेगी।

  • असेंबली बी जिसमें आपकी प्रॉक्सी कक्षा और आपके रिमोट लोडर होंगे।

यहाँ आप क्या करने की कोशिश कर सकते हैं: विधानसभा ए

  • से

    1. लोड आवेदन नया AppDomain उदाहरण बनाएँ।

    2. विधानसभा बी

      एक से नए AppDomain में अपने "दूरस्थ लोडर" वर्ग का एक उदाहरण इन्स्तांत। इससे असेंबली बी को ऐपडोमेन में लोड किया जाएगा।

    3. अपने "रिमोट लोडर" से, असेंबली सी लोड करें और अपनी पुरानी कक्षा को तुरंत चालू करें, फिर मूल ऐपडोमेन में प्रॉक्सी क्लास का एक उदाहरण वापस पास करें।

    4. अब उम्मीद है कि आप वस्तु के अधिक सामान्य संस्करण (संभवतः एक इंटरफेस?) को स्वीकार करने के लिए अपने तरीकों को संशोधित कर सकते हैं कि प्रॉक्सी और आपका नया वर्ग संस्करण दोनों लागू हो सकता है।

  • +0

    +1 .. धन्यवाद, इसमें देखेंगे .. लेकिन अभी मेरे आवेदन के साथ इसे एकीकृत नहीं कर सकता। प्रतिबिंब का उपयोग कर बाहर कोई रास्ता है .. ?? –

    +0

    मैंने इसे प्रतिबिंब केवल विधि के साथ अपडेट किया है, हालांकि मैं सुझाव दूंगा कि आप वास्तव में उस चीज़ पर पुनर्विचार करें जो आप प्राप्त करने की कोशिश कर रहे हैं क्योंकि यह अधिक जटिल हैक है। – doogle