मुझे कई बार ऐसा करना पड़ा है और कई अलग-अलग समाधानों पर शोध किया है।
समाधान जो मुझे सबसे सुरुचिपूर्ण और आसानी से पूरा होता है उसे इस तरह से लागू किया जा सकता है।
1. एक प्रोजेक्ट बनाएं जिसे आप एक सरल इंटरफ़ेस बना सकते हैं
इंटरफ़ेस में आपके द्वारा कॉल किए जाने वाले किसी भी सदस्य के हस्ताक्षर होंगे।
public interface IExampleProxy
{
string HelloWorld( string name );
}
इस परियोजना को साफ और लाइट रखना महत्वपूर्ण है। यह एक ऐसी परियोजना है, जो दोनों AppDomain
को संदर्भित कर सकती है और हमें Assembly
हमारे ग्राहक सभा से अलग डोमेन में लोड करने की इच्छा का संदर्भ नहीं देने की अनुमति देगी ।
2. अब वह प्रोजेक्ट बनाएं जिसमें वह कोड हो जिसे आप अलग करना चाहते हैं AppDomain
।
क्लाइंट प्रेज के साथ यह परियोजना प्रॉक्सी प्रोज को संदर्भित करेगी और आप इंटरफ़ेस को लागू करेंगे।
public interface Example : MarshalByRefObject, IExampleProxy
{
public string HelloWorld( string name )
{
return $"Hello '{ name }'";
}
}
3. अगला, क्लाइंट प्रोजेक्ट में, कोड को दूसरे में लोड करें AppDomain
।
तो, अब हम एक नया बनाते हैं AppDomain
। विधानसभा संदर्भों के लिए आधार स्थान निर्दिष्ट कर सकते हैं। जांच GAC में और वर्तमान निर्देशिका और AppDomain
बेस लोके में निर्भर असेंबलियों के लिए जाँच करेगा ।
// set up domain and create
AppDomainSetup domaininfo = new AppDomainSetup
{
ApplicationBase = System.Environment.CurrentDirectory
};
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain exampleDomain = AppDomain.CreateDomain("Example", adevidence, domaininfo);
// assembly ant data names
var assemblyName = "<AssemblyName>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null|<keyIfSigned>";
var exampleTypeName = "Example";
// Optional - get a reflection only assembly type reference
var @type = Assembly.ReflectionOnlyLoad( assemblyName ).GetType( exampleTypeName );
// create a instance of the `Example` and assign to proxy type variable
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( assemblyName, exampleTypeName );
// Optional - if you got a type ref
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( @type.Assembly.Name, @type.Name );
// call any members you wish
var stringFromOtherAd = proxy.HelloWorld( "Tommy" );
// unload the `AppDomain`
AppDomain.Unload( exampleDomain );
यदि आप की जरूरत है, वहाँ एक विधानसभा लोड करने के लिए विभिन्न तरीकों की एक टन कर रहे हैं। आप इस समाधान के साथ एक अलग तरीके का उपयोग कर सकते हैं। यदि आपके पास असेंबली योग्य नाम है, तो मैं इसका उपयोग करना पसंद करता हूं CreateInstanceAndUnwrap
क्योंकि यह असेंबली बाइट्स को लोड करता है और फिर आपके लिए अपने प्रकार को इंस्टेंट करता है और रिटर्न करता है object
कि आप अपने प्रॉक्सी प्रकार को सरल कास्ट कर सकते हैं या यदि आप दृढ़ता से टाइप किए गए कोड में नहीं हैं तो आप कर सकते हैं डायनेमिक लैंग्वेज रनटाइम का उपयोग करें और dynamic
टाइप किए गए वेरिएबल को दिए गए ऑब्जेक्ट को असाइन करें और फिर सीधे उस पर सदस्यों को कॉल करें।
ये लो।
यह एक असेंबली को लोड करने की अनुमति देता है जो आपके क्लाइंट प्रॉजे नॉट के पास एक अलग में संदर्भ है AppDomain
और क्लाइंट से उस पर कॉल सदस्य हैं।
परीक्षण करने के लिए, मुझे Visual Studio में मॉड्यूल विंडो का उपयोग करना पसंद है। यह आपको अपना क्लाइंट असेंबली डोमेन दिखाएगा और उस डोमेन में सभी मॉड्यूल लोड किए गए हैं और साथ ही आपके नए ऐप डोमेन और उस डोमेन में क्या असेंबली या मॉड्यूल लोड किए गए हैं।
कुंजी या तो यह सुनिश्चित करने के लिए है कि आप कोड या तो व्युत्पन्न करते हैं MarshalByRefObject
या क्रमबद्ध हैं।
`MarshalByRefObject आपको डोमेन के जीवनकाल को इसके अंदर कॉन्फ़िगर करने की अनुमति देगा। उदाहरण के लिए, यदि आप चाहते हैं कि डोमेन को नष्ट कर दिया जाए तो प्रॉक्सी को 20 मिनट में कॉल नहीं किया जाएगा।
आशा है कि ये आपकी मदद करेगा।