偶尔,我看到typeof(Foo)
返回null。为什么会这样?
这是在C#,.NET 3.5中。
我认为它可能与包含尚未加载的类型的程序集有关,但是测试应用程序显示程序在使用typeof
的方法的开头加载。
有什么想法吗?
更新1
更新2
有问题的应用程序使用huuuuuge内存量并在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)
。
我查看了模块窗口,并且已经加载了包含此类型和方法的模块,并且看起来没有任何加载器错误。
答案 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中,所以这可能不是你典型的场景,但仍然认为我会提到它。