2010-12-03 12 views
7

लागू करने के लिए प्रयास कर रहा है मैं Assembly.GetTypes() उपयोग कर रहा हूँ सभी प्रकार के एक प्लगइन पुस्तकालय में द्वारा परिभाषित प्राप्त करने के लिए (इसलिए मैं प्लगइन उदाहरणों का दृष्टांत सकते हैं)।ReflectionTypeLoadException: प्रकार एक दुर्गम इंटरफ़ेस

Type <Type> is attempting to implement an inaccessible interface 

Googling ऐसा लगता है क्योंकि विशिष्ट प्रकार एक गैर सरकारी इंटरफ़ेस लागू करता है:

एक विशेष पुस्तकालय पर, विधि कह एक ReflectionTypeLoadException बढ़ा,। और वास्तव में यह है, लेकिन टाइप एक अन्य सार्वजनिक वर्ग में निहित है, जिसे निजी घोषित किया गया है।

इस अपवाद से कैसे बचें?

....

निर्मित इंटरफ़ेस सार्वजनिक कोड काम करता है। क्या यह अजीब व्यवहार परिभाषित करना संभव है एक बग (विधानसभा में। गेट टाइप())? इसका मतलब यह है कि एक लाइब्रेरी प्रकार संरक्षित इंटरफेस लागू नहीं कर सकता है!

+1

यह है एक प्रकार को तत्काल करने के लिए मेजबान को कठिन समय देने के लिए मूर्खतापूर्ण। असेंबली। गेट टाइप() * कभी * आवश्यक नहीं होना चाहिए। फैक्ट्री क्लास को एक अच्छा नाम दें। –

+0

@ हंस, क्या आप फैक्ट्री क्लास का सुझाव दे रहे हैं कि एक विशिष्ट नेमस्पेस * और * नाम होना चाहिए जो एक मेजबान अपेक्षा करेगा ताकि वे सीधे 'टाइप' को पकड़ सकें? –

+0

@ * हंस पासेंट * यह उचित लगता है। लेकिन मूल समस्या अभी तक हल नहीं हुई है। क्या होगा यदि प्रकार सार्वजनिक नहीं है और गैर-सार्वजनिक इंटरफ़ेस लागू करता है? – Luca

उत्तर

8

समस्या को सार्वजनिक प्रकार से सुरक्षित नेस्टेड प्रकार को हटाकर हल किया गया था।

0

संदेशपैक क्रमबद्धता के दौरान मुझे एक ही समस्या का सामना करना पड़ा। मैं आंतरिक वर्ग में इंटरफ़ेस को कार्यान्वित करने की कोशिश कर रहा था, इसलिए यह "असेंबली से" संदेशपैक से यह अपवाद बताता है। रीसोलर्स। डायनामिक ऑब्जेक्ट रीसोलवर, संस्करण = 0.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = नल 'एक अप्राप्य इंटरफ़ेस को कार्यान्वित करने का प्रयास कर रहा है। " तो मैं ले लिया है कि एक ही नाम स्थान में अपने कंटेनर कक्षा से बाहर आंतरिक वर्ग नीचे मेरी पहले और बाद में कोड ... से पहले ....

using MessagePack; 
using System; 

namespace ConsoleApp1 
{ 
    class CallbackReciever 
    { 

     [MessagePackObject] 
     public class SampleCallback : IMessagePackSerializationCallbackReceiver 
     { 
      [Key(0)] 
      public int Key { get; set; } 

      public void OnBeforeSerialize() 
      { 
       Console.WriteLine("OnBefore"); 
      } 

      public void OnAfterDeserialize() 
      { 
       Console.WriteLine("OnAfter"); 
      } 
     } 

     public static void Main() 
     { 
      SampleCallback b1 = new SampleCallback { Key = 1 }; 

      Console.WriteLine("Starting serialization"); 
      byte[] data = MessagePackSerializer.Serialize<dynamic>(b1); 

      foreach (byte b in data) 
      { 
       Console.WriteLine(b); 
      } 

      SampleCallback temp = MessagePackSerializer.Deserialize<SampleCallback>(data); 
      Console.WriteLine(MessagePackSerializer.ToJson(temp)); 
     } 
     } 
} 

के बाद ....

using MessagePack; 
using System; 

namespace ConsoleApp1 
{ 
    [MessagePackObject] 
    public class SampleCallback : IMessagePackSerializationCallbackReceiver 
    { 
     [Key(0)] 
     public int Key { get; set; } 

     public void OnBeforeSerialize() 
     { 
      Console.WriteLine("OnBefore"); 
     } 

     public void OnAfterDeserialize() 
     { 
      Console.WriteLine("OnAfter"); 
     } 
    } 
    class CallbackReciever 
    { 



     public static void Main() 
     { 
      SampleCallback b1 = new SampleCallback { Key = 1 }; 

      Console.WriteLine("Starting serialization"); 
      byte[] data = MessagePackSerializer.Serialize<dynamic>(b1); 

      foreach (byte b in data) 
      { 
       Console.WriteLine(b); 
      } 

      SampleCallback temp = MessagePackSerializer.Deserialize<SampleCallback>(data); 
      Console.WriteLine(MessagePackSerializer.ToJson(temp)); 
      Console.ReadKey(); 
     } 
     } 
} 
संबंधित मुद्दे