【发布时间】: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 和公司的问题。