【问题标题】:GetExportedTypes() on an assembly throws NotSupportedException程序集上的 GetExportedTypes() 引发 NotSupportedException
【发布时间】:2012-08-22 05:56:41
【问题描述】:

我在将 Windows Phone 7.5 类库加载到 WP 单元测试框架中时遇到了一些严重的问题。它在我的程序集内部调用 GetExportedTypes(),这会引发不包含任何详细信息的 ReflectionTypeLoadException。它的消息是“ReflectionTypeLoadException”,并且它的 LoaderExceptions 为空(“无法计算表达式”)。该程序集未使用任何第 3 方程序集。如果我创建一个单独的 WP7 应用程序并做同样的事情,我会得到相同的结果。我是一个非常有经验的反射用户,但是由于没有任何详细的错误,我的研究完全停止了。只是为了完整起见,它是 Fluent Assertions 的 Windows Phone 版本。

【问题讨论】:

  • “无法计算表达式”和null 不一样。您可以尝试在代码中捕获异常并在那里访问LoaderExceptions
  • 我试过了,但是当我探测 LoaderExceptions 时,我得到“无法计算表达式”。
  • 不要“探测”。将其分配给一个变量,如果您仍然无法在调试器中看到它的值,甚至可以将其转换为字符串...
  • 很奇怪。 InnerException呢?
  • null 也是如此。在我作为 .NET 开发人员的整个职业生涯中,我从未见过如此奇怪的异常。

标签: windows-phone-7 reflection


【解决方案1】:

异常中的Types 数组呢?它包含值吗?如果有,它是否也包含nulls?如果是这样,您可以找出哪些类加载失败:您知道程序集中的所有类,并且您知道哪些类加载正确。缺少的是无法加载的类。也许这个信息提供了一些线索。

这个答案是基于documentation,尤其是这些位:

来自LoaderExceptions 属性的备注:

LoaderExceptions 属性检索与 Types 数组平行的 Exception 类型数组。每当反射无法加载类时,此数组将包含空值。

并且来自Types 属性的文档:

Type 类型的数组,包含在模块中定义并加载的类。这个数组可以包含一些空值。

【讨论】:

  • 不。它是 (不,不是空的)
  • 哇。现在您需要从头开始:(1)创建一个测试应用程序,通过反射加载您的程序集并验证它是否按照描述失败(2)从该程序集中删除类,直到加载不再失败(3)您现在得到了冒犯类,希望能找到问题。
  • 但是什么样的结构会导致这种情况呢?知道这应该有助于我找出这一切的根本原因。
  • 请参阅this answer 了解此异常的一个可能原因。为什么异常的所有属性都是 null 是我无法回答的。
  • 经过数小时的反复试验,我已将问题追溯到我项目中的一个嵌套类。见fluentassertions.codeplex.com/SourceControl/changeset/view/…。每当我避免调用它的 Use() 方法时,问题就会消失。这门课有什么特别之处让 WP7 窒息?
【解决方案2】:

我找到了! @GeertvanHorrik 指向我最近写的 blog post。我正在使用运行时 (!) 不支持的协变接口(使用 out 参数)。为什么编译器不保护我免受这对我来说是一个很大的谜团(也是一个巨大的失望)

【讨论】:

  • 仅供参考,博客文章链接现在返回 404。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多