ReflectionTypeLoadException: Type пытается реализовать недоступный интерфейс

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

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

Type <Type> is attempting to implement an inaccessible interface

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

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

....

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

2 ответов


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


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