ReflectionTypeLoadException: Tipo sta cercando di implementare un'interfaccia inaccessibile
-
08-10-2019 - |
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!
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();
}
}
}