我正在使用Assembly.GetTypes()来获取插件库中定义的所有类型(因此我可以实例化插件实例)。
在特定的库中,该方法引发ReflectionTypeLoadException,说:
Type <Type> is attempting to implement an inaccessible interface
谷歌搜索它似乎是因为特定的类型实现了非公共接口。实际上它是,但Type嵌套在另一个公共类中,声明为private。
如何避免这种例外?
....
制作界面公共代码工作。是否有可能定义这种奇怪的行为是一个bug(在Assembly.GetTypes()中)?这意味着库类型无法实现受保护的交互式界面!
通过从公共类型中删除受保护的嵌套类型来解决该问题。
MessagePack序列化时遇到了同样的问题。我试图在内部类中实现接口,所以它从“程序集”MessagePack.Resolvers.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();
}
}
}