我目前在.NET桌面应用程序中使用以下方法获取所有类类型:
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
问题是在某些机器上,这一行实际上会抛出一个ReflectionTypeLoadException。
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.RuntimeModule.GetTypes()
at System.Reflection.Assembly.GetTypes()
at MyProgram.Package.Class.?????????????????????????????????????????(Assembly )
at MyProgram.Package.Class..cctor()
我可以通过简单地捕获异常并在此manner中获取有效类型来解决这个问题:
try
{
types = Assembly.GetExecutingAssembly().GetTypes();
return types;
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => ((t != null))).ToArray();
return types;
}
经过进一步分析后,我注意到我的问题机器 SystemClassName 类型按预期存在,但 SystemClassName + d__n 类型(包括在我的普通机器上)被排除在外由上面的异常处理程序。
我不知道为什么会生成这些,但我注意到这些方法名称类型仅为标记为 async 的方法生成。如果我从方法名称中删除所有异步关键字(并在这些方法上手动调用.Wait()),那么构建在有问题的机器上工作正常,而无需任何异常处理。
有人能解释一下发生了什么吗?
更新:打印出LoaderExceptions属性会显示以下内容:
Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)