C# ReflectionTypeLoadException:类型正在尝试实现不可访问的接口

C# ReflectionTypeLoadException:类型正在尝试实现不可访问的接口,c#,reflection,typeloadexception,C#,Reflection,Typeloadexception,我正在使用Assembly.GetTypes()获取插件库中由定义的所有类型(这样我就可以实例化插件实例) 在特定库上,该方法引发ReflectionTypeLoadException,表示: Type <Type> is attempting to implement an inaccessible interface Type正在尝试实现不可访问的接口 谷歌搜索似乎是因为特定类型实现了一个非公共接口。实际上是这样,但是类型嵌套在另一个公共类中,声明为private 如何避免这

我正在使用Assembly.GetTypes()获取插件库中由定义的所有类型(这样我就可以实例化插件实例)

在特定库上,该方法引发ReflectionTypeLoadException,表示:

Type <Type> is attempting to implement an inaccessible interface
Type正在尝试实现不可访问的接口
谷歌搜索似乎是因为特定类型实现了一个非公共接口。实际上是这样,但是类型嵌套在另一个公共类中,声明为private

如何避免这种例外


使接口公开代码工作。在Assembly.GetTypes()中,是否可以将这种奇怪的行为定义为bug?这意味着库类型无法实现受保护的接口

通过从公共类型中删除受保护的嵌套类型,问题得以解决。

在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));
        }
        }
}
使用MessagePack;
使用制度;
名称空间控制台EAPP1
{
类回调接收器
{
[MessagePackObject]
公共类SampleCallback:IMessagePackSerializationCallbackReceiver
{
[关键(0)]
公共int密钥{get;set;}
public void OnBeforeSerialize()
{
Console.WriteLine(“OnBefore”);
}
反序列化()后的公共无效
{
控制台。写入线(“OnAfter”);
}
}
公共静态void Main()
{
SampleCallback b1=新SampleCallback{Key=1};
Console.WriteLine(“开始序列化”);
字节[]数据=MessagePackSerializer.Serialize(b1);
foreach(数据中的字节b)
{
控制台写入线(b);
}
SampleCallback temp=MessagePackSerializer.Deserialize(数据);
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();
        }
        }
}
使用MessagePack;
使用制度;
名称空间控制台EAPP1
{
[MessagePackObject]
公共类SampleCallback:IMessagePackSerializationCallbackReceiver
{
[关键(0)]
公共int密钥{get;set;}
public void OnBeforeSerialize()
{
Console.WriteLine(“OnBefore”);
}
反序列化()后的公共无效
{
控制台。写入线(“OnAfter”);
}
}
类回调接收器
{
公共静态void Main()
{
SampleCallback b1=新SampleCallback{Key=1};
Console.WriteLine(“开始序列化”);
字节[]数据=MessagePackSerializer.Serialize(b1);
foreach(数据中的字节b)
{
控制台写入线(b);
}
SampleCallback temp=MessagePackSerializer.Deserialize(数据);
WriteLine(MessagePackSerializer.ToJson(temp));
Console.ReadKey();
}
}
}

让主机很难实例化类型是愚蠢的。Assembly.GetTypes()不应该是必需的。给工厂类起一个好名字。@Hans,你是否建议工厂类应该有一个主机期望的特定名称空间和名称,以便它们可以直接获取
类型
?@*Hans Passant*这似乎是合理的。但基本问题尚未解决。如果类型不是公共的,并且实现了非公共接口,该怎么办?