मैं निम्नलिखित कोड के साथ कुछ समस्या आ रही है:Type.IsSubclassOf() AppDomains में काम नहीं करता है?
private class ClientPluginLoader : MarshalByRefObject
{
public bool IsPluginAssembly(string filename)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomainReflectionOnlyAssemblyResolve);
Assembly asm = Assembly.ReflectionOnlyLoadFrom(filename);
Type[] types = asm.GetTypes();
foreach (Type type in types)
{
if (type.IsSubclassOf(typeof(ClientPlugin)))
{
return true;
}
}
return false;
}
}
कोड एक प्रॉक्सी है कि मैं अपने कस्टम अनुप्रयोग डोमेन के CreateInstanceFromAndUnwrap माध्यम से बनाए गए के माध्यम से कहा जाता है()। इसका मतलब है कि IsPluginAssembly() को मेरे कस्टम ऐप डोमेन के संदर्भ में निष्पादित किया गया है।
समस्या यह है कि IsSubclassOf() हमेशा कॉल झूठी होती है, भले ही इसे IMHO सच करना चाहिए। प्रश्न में "प्रकार" वास्तव में क्लाइंटप्लगिन से प्राप्त होता है - इसमें कोई संदेह नहीं है।
क्लाइंटप्लगिन को एक अलग निजी असेंबली में परिभाषित किया गया है, जिसे मैं ऊपर कोड कोड खंड में स्पष्ट रूप से हल कर रहा हूं।
मैं if (type.IsSubclassOf(...))
लाइन पर एक ब्रेकपाइंट डाल दिया है और इस बात की पुष्टि यह अभिव्यक्ति गलत होने के लिए:
type.BaseType == typeof(ClientPlugin)
दूसरी ओर, यह अभिव्यक्ति सत्य है:
type.BaseType.FullName == typeof(ClientPlugin).FullName
यह संभव कैसे है ? क्या चल रहा है?
अद्यतन: केंट बूगार्ट ने मुझे सही दिशा में इंगित किया। मैंने वेब को थोड़ा और खोजा और this ब्लॉग पोस्ट में चलाया। ऐसा लगता है कि इस काम को करने के लिए मुझे अपने लोड/लोडफ्रम/प्रतिबिंबऑनलीलोड से संघर्षों को हल करना होगा।
मेरे पास वास्तव में यह समस्या थी, मेरे पास दो फ़ोल्डरों में एक ही डीएलएल की दो प्रतियां थीं। मैन्युअल रूप से "IsSubclassOf" को निष्पादित करते समय, मुझे यह त्रुटि संदेश मिला: 'ServiceCore.BaseService' प्रकार 'ServiceCore.dll' और 'ServiceCore.dll' दोनों में मौजूद है। – vpalmu