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

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

这是在C#,.NET 3.5中。

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

有任何想法吗?


更新1

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

更新2

有问题的应用程序使用huuuuuge内存量并在32位XP上运行。 我想也许它是一个TypeLoadException或OutOfMemoryException,它以某种方式被吞下(但我看不出如何,因为我在调试器中启用了第一次机会exception时尝试过)。


更新3

刚才遇到同样的问题。 这是堆栈跟踪: 在此处输入图像描述 到目前为止的代码实际上只是:

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

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

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

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


由于某种原因加载dll失败了吗? 你检查了融合日志吗?

我认为这会导致更多的问题而不仅仅是这个,但是如果你在使用程序集中的任何东西之前进行这项检查,它可能会隐藏任何进一步的问题。

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

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

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

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

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

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

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