由于ReflectionTypeLoadException

时间:2017-04-09 22:20:18

标签: c# .net reflection .net-assembly

我试图在C#中使用System.Reflection将所有已定义的类型检索到.NET程序集中。首先我加载程序集:

var assembly = Assembly.LoadFrom("C:\...\myassembly.dll");

然后我尝试获取程序集中类型的所有TypeInfo

try {
    var types = assembly.DefinedTypes;
}
catch(ReflectionTypeLoadException ex)
{
    var errorMessage = new StringBuilder();
    errorMessage.AppendLine($"Error loading defined types in assembly {this.assembly.FullName}. Found {ex.LoaderExceptions.Length} errors:");

    foreach (var innerException in ex.LoaderExceptions)
    {
        errorMessage.AppendLine($"{innerException.GetType().Name} - {innerException.HResult}: {innerException.Message}");
    }

    throw new InvalidOperationException(errorMessage.ToString(), ex);
}

故障

我遇到的失败是ReflectionTypeLoadException,我在ex.LoaderExceptions遇到了很多例外情况,例如:

  

-2146233054:无法从程序集'myassembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'MyType',因为方法'.ctor'没有实现(没有RVA)

关于反思背景

我发现this question处理了同样的问题,其中一个建议是使用:

var assembly = Assembly.ReflectionOnlyLoadFrom("C:\...\myassembly.dll");

这似乎很合乎逻辑。然而它没有用。

我的问题

我的问题很简单:如何通过忽略程序集中未完全定义或缺少实现的类型的错误,从可用类型中获取所有TypeInfo

我知道ex.Types会给我一个我可以在异常中使用的类型列表,但这会给我一个System.Type而不是System.Reflection.TypeInfo。我想要后者,因为它有更多关于我需要的类型的信息。我链接的问题没有处理这个问题!

1 个答案:

答案 0 :(得分:2)

您可以通过调用TypeInfo扩展方法从Type对象获取IntrospectionExtensions.GetTypeInfo。所以应该这么简单:

var typeInfo = ex.Types.Select(IntrospectionExtensions.GetTypeInfo).ToArray();