为什么typeof(Foo)会返回null?

时间:2011-01-20 10:18:18

标签: c# .net

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

这是在C#,.NET 3.5中。

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

有什么想法吗?


更新1

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

更新2

有问题的应用程序使用huuuuuge内存量并在32位XP上运行。我想也许它是一个TypeLoadException或OutOfMemoryException,它以某种方式被吞噬(但是我无法看到,因为我在调试器中启用了第一次机会异常时尝试了这一点。)


更新3

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

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

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

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

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


5 个答案:

答案 0 :(得分:4)

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

我认为这会导致更多问题而不仅仅是这个问题,但如果你在使用程序集中的任何内容之前进行此检查,则可能会隐藏任何其他问题。

答案 1 :(得分:2)

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

看到一些证明这一点的代码会很有趣。

更有趣的是,它有时会发生,有时则不会发生。

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

答案 2 :(得分:1)

typeof在编译期间确定类型。所以即使它返回null,它也应该总是返回null。因为在运行时期间行为不会更改。给一些代码片段一些其他的东西都坏了。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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