2010-12-03 2 views
7

Я использую Assembly.GetTypes() для получения всех типов, определенных в библиотеке плагинов (чтобы я мог создавать экземпляры плагина).ReflectionTypeLoadException: Type пытается реализовать недоступный интерфейс

На конкретной библиотеке, способ поднять ReflectionTypeLoadException, говоря:

Type <Type> is attempting to implement an inaccessible interface 

погуглить, кажется, так как удельный Тип реализует непубличный интерфейс. И на самом деле это так, но Тип вложен в другой открытый класс, объявленный как закрытый.

Как избежать этого исключения?

....

Made interface public код работает. Можно ли определить это странное поведение, это ошибка (в Assembly.GetTypes())? Это означает, что тип библиотеки не может реализовать защищенный интерфейс!

+1

Это глупо, чтобы дать хозяину трудное время для создания экземпляра типа. Assembly.GetTypes() должен * никогда не быть необходимым. Дайте фабричному классу хорошее имя. – 2010-12-03 22:32:37

ответ

8

Проблема была решена путем удаления защищенного вложенного типа из общедоступного типа.

0

Я столкнулся с такой же проблемой, пока сериализация MessagePack. Я пытался реализовать интерфейс во внутреннем классе, так что это исключение «из сборки» MessagePack.Resolvers.DynamicObjectResolver, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null «пытается реализовать недоступный интерфейс». Так что я взял, что внутренний класс из контейнерного класса в том же пространстве имен ниже мой до и после того, как код ... Перед ....

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(); 
     } 
     } 
} 
Смежные вопросы