【问题标题】:Why would typeof(Foo) ever return null?为什么 typeof(Foo) 会返回 null?
【发布时间】:2011-01-20 10:18:17
【问题描述】:

有时,我看到 typeof(Foo) 返回 null。为什么会这样?

这是在 C#、.NET 3.5 中。

我认为这可能与包含尚未加载的类型的程序集有关,但测试应用程序显示该程序集是在使用 typeof 的方法的开头加载的。

有什么想法吗?


更新 1

  • 我无法提供可重现的样本,因为这种情况发生在大型应用程序中
  • 当我说“偶尔”时,我的意思是在我的应用程序中使用相同的方法,但在不同的情况下。此外,当它在运行时失败一次时,对于该应用程序实例,它每次都会失败。

更新 2

有问题的应用程序使用大量内存并在 32 位 XP 上运行。我在想可能是 TypeLoadException 或 OutOfMemoryException 以某种方式被吞没了(但我看不出是怎么回事,因为我已经在调试器中打开了第一次机会异常)。


更新 3

刚才遇到了同样的问题。这是堆栈跟踪: 到目前为止的代码实际上只是:

Type tradeType = typeof(MyTradeType)
TradeFactory.CreateTrade(tradeType)

(之前是 ..CreateTrade(typeof(MyTradeType)),所以 我实际上无法判断 typeof 是否返回 null

所以,看起来 typeof() 没有返回 null,但它CreateTrade 方法结束时被设置为 null

异常 (NullReferenceException) 的 HResult 属性为 0x80004003 (Invalid pointer)。调用System.Runtime.InteropServices.Marshal.GetLastWin32Error( )(在即时窗口中)返回127 (The specified procedure could not be found)。 我查看了“模块”窗口,包含此类型和方法的模块已加载,看起来没有任何加载器错误。


【问题讨论】:

  • 有趣。你能提供一个代码示例来演示这个问题吗?
  • “偶尔”是指偶尔在同一个电话中或在某些地方而不是在其他地方吗?
  • 我无法想象这会以任何方式发生。
  • 请说明发生这种情况的整个语句。我怀疑您遗漏了一些重要信息。
  • 这可能是 Eric Lippert 和公司的问题。

标签: c# .net


【解决方案1】:

由于某种原因加载 dll 失败了吗?你查过fusion logs吗?

我认为这会导致更多问题,但如果您在使用程序集中的任何内容之前进行此检查,则可能会隐藏任何进一步的问题。

【讨论】:

    【解决方案2】:

    由于typeof(T) 是编译时运算符,因此不会涉及程序集的加载时间。

    看到一些演示这一点的代码会很有趣。

    更有趣的是看到它有时发生有时不发生。

    第一个答案可能是:在实例上使用 GetType()

    【讨论】:

    • 解析是编译时,但是加载器在方法开始时加载包含 IFoo 的模块。
    【解决方案3】:

    typeof 在编译期间确定类型。因此,即使它返回 null,它也应该始终返回 null。因为行为在运行时不会改变。给一些代码 sn -p 其他东西坏了。

    【讨论】:

    • 但我看不出它如何返回 null。我正在尝试重现一个使用大量内存的测试应用程序,因为我认为这是一个被吞噬的类型加载异常。
    • @Steve 我并不是说 typeof 会返回 null。但是由于类型是在编译时推导出来的,所以在运行时行为应该保持不变。它不能在不同的时间表现不同。据我所知,typeof 从未返回 null。
    【解决方案4】:

    在包的构造函数中使用 typeof(MyClass) 时,我在 VSPackage 项目中遇到了这个问题。我将我的代码移到了重写的 Initialize() 方法,然后它工作正常,所以看起来程序集尚未加载但有时可能是导致此错误的一个因素。我还要注意,我的 VSPackage 是在运行时通过 MEF 加载到 Visual Studio 中的,所以这可能不是你的典型场景,但我仍然认为我会提到它。

    【讨论】:

      【解决方案5】:

      这是很有可能的,而且很容易重现。 如果类型已在内存中创建,typeof(T) 将返回 null。 以System.Reflection.Emit 为例。

      【讨论】:

      • 有点道理。但是任何关于为什么它会为已编译的类返回 null 的想法也会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2013-08-09
      • 2013-06-05
      • 2014-05-23
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多