簡體   English   中英

為什么typeof(Foo)會返回null?

[英]Why would typeof(Foo) ever return null?

偶爾,我看到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屬性為0x80004003Invalid pointer )。 System.Runtime.InteropServices.Marshal.GetLastWin32Error( ) (在立即窗口中)的調用返回127 (The specified procedure could not be found) 我查看了模塊窗口,並且已經加載了包含此類型和方法的模塊,並且看起來沒有任何加載器錯誤。


由於某種原因加載dll失敗了嗎? 你檢查了融合日志嗎?

我認為這會導致更多的問題而不僅僅是這個,但是如果你在使用程序集中的任何東西之前進行這項檢查,它可能會隱藏任何進一步的問題。

由於typeof(T)是編譯時運算符,因此不會涉及程序集的加載時間。

看到一些證明這一點的代碼會很有趣。

更有趣的是,它有時會發生,有時卻不會發生。

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

在包的構造函數中使用typeof(MyClass)時,我在VSPackage項目中遇到此問題。 我將我的代碼移動到重寫的Initialize()方法,然后它工作正常,所以看起來組件沒有被加載但可能是這個錯誤的一個因素有時。 我也會注意到我的VSPackage是在運行時通過MEF加載到Visual Studio中的,所以這可能不是你典型的場景,但仍然認為我會提到它。

typeof在編譯期間確定類型。 所以即使它返回null,它也應該總是返回null。 因為在運行時期間行為不會更改。 給一些代碼片段一些其他東西被打破。

這很有可能並且很容易重現。 如果在內存中創建了類型, typeof(T)將返回null。 System.Reflection.Emit為例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM