我试图在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
。我想要后者,因为它有更多关于我需要的类型的信息。我链接的问题没有处理这个问题!
答案 0 :(得分:2)
您可以通过调用TypeInfo
扩展方法从Type
对象获取IntrospectionExtensions.GetTypeInfo
。所以应该这么简单:
var typeInfo = ex.Types.Select(IntrospectionExtensions.GetTypeInfo).ToArray();