ReflectionTypeLoadException: Tipo sta cercando di implementare un'interfaccia inaccessibile

StackOverflow https://stackoverflow.com/questions/4350363

Domanda

sto usando Assembly.GetTypes () per ottenere tutti i tipi definiti da in una libreria di plug-in (in modo da poter istanziare casi plugin).

In una particolare libreria, il metodo di sollevare un ReflectionTypeLoadException, dicendo:

Type <Type> is attempting to implement an inaccessible interface

Googling sembra perché la specifica Tipo implementa un'interfaccia non pubblico. E in realtà lo è, ma il Tipo è nidificato in un'altra classe pubblica, dichiarata come privata.

Come evitare questa eccezione?

....

interfaccia resa pubblica il codice funziona. E 'possibile definire questo strano comportamento è un bug (in Assembly.GetTypes ())? Questo implica che un tipo di libreria non può implementare un interaface protetta!

È stato utile?

Soluzione

Il problema è stato risolto rimuovendo il protetto annidato tipo dal tipo di pubblico.

Altri suggerimenti

I affrontato lo stesso problema, mentre MessagePack serializzazione. Stavo cercando di implementare l'interfaccia in classe interna in modo da Thew questa eccezione "dal gruppo 'MessagePack.Resolvers.DynamicObjectResolver, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' sta tentando di implementare un'interfaccia inaccessibile." Così ho preso quella classe interna fuori della sua classe contenitore in stesso spazio dei nomi di seguito è la mia prima e dopo il codice ... Prima ....

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));
        }
        }
}

Dopo ....

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();
        }
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top