ReflectionTypeLoadException: Тип пытается реализовать недоступный интерфейс - PullRequest
7 голосов
/ 04 декабря 2010

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

В конкретной библиотеке метод вызывает исключение ReflectionTypeLoadException, говоря:

Type <Type> is attempting to implement an inaccessible interface

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

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

....

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

Ответы [ 2 ]

8 голосов
/ 26 сентября 2012

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

2 голосов
/ 27 декабря 2017

Я столкнулся с той же проблемой при сериализации MessagePack. Я пытался реализовать интерфейс во внутреннем классе, поэтому это исключение «из сборки» MessagePack.Resolvers.DynamicObjectResolver, версия = 0.0.0.0, Culture = нейтральный, 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();
        }
        }
}
...