ReflectionTypeLoadException: Tipo está tratando de implementar una interfaz inaccesibles
-
08-10-2019 - |
Pregunta
Estoy usando Assembly.GetTypes () para obtener todos los tipos definidos por el plug-in en una biblioteca (para que pueda crear una instancia de casos plugin).
En una biblioteca particular, el aumento método de una ReflectionTypeLoadException, diciendo:
Type <Type> is attempting to implement an inaccessible interface
buscar en Google que parece porque la específica Tipo implementa una interfaz que no sea pública. Y de hecho lo es, pero el Tipo está anidada en otra clase pública, declarada como privado.
¿Cómo evitar esta excepción?
....
públicas interfaz Hecho el código funciona. ¿Es posible definir este comportamiento extraño es un insecto (en Assembly.GetTypes ())? Esto implica que un tipo de biblioteca no puede implementar un interaface protegida!
Solución
El problema se resolvió mediante la eliminación de la protección anidado tipo del tipo de público.
Otros consejos
Me enfrentó misma edición, mientras que MessagePack serialización. Yo estaba tratando de implementar la interfaz en la clase interna por lo que Thew esta excepción "de montaje 'MessagePack.Resolvers.DynamicObjectResolver, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' está tratando de implementar una interfaz inaccesible." Así que tomé esa clase interna de su clase en el mismo espacio de nombres de contenedores a continuación es mi antes y después de código ... Antes ....
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));
}
}
}
Después de ....
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();
}
}
}