异步方法出现时的ReflectionTypeLoadException

时间:2017-02-06 18:25:28

标签: c# system.reflection

我目前在.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()),那么构建在有问题的机器上工作正常,而无需任何异常处理。

有人能解释一下发生了什么吗?

  • 我的开发机器是:Windows 10 - CLR版本:4.0.30319.42000
  • 我有问题的机器是:Windows 7 x86 - CLR版本:4.0.30319.1
  • 我的目标是.NET4.0并使用Microsoft.Bcl.Async Nugget包

更新:打印出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)

0 个答案:

没有答案