2011-01-20 18 views
21

Occasionalmente, vedo che typeof(Foo) restituisce null. Perché dovrebbe succedere?Perché typeof (Foo) restituisce mai null?

Questo è in C#, .NET 3.5.

Ho pensato che potrebbe avere qualcosa a che fare con l'assembly contenente il tipo non ancora caricato, ma un'applicazione di test mostra che l'assembly è caricato all'inizio del metodo in cui viene utilizzato typeof.

Qualche idea?


Aggiornamento 1

  • non posso fornire un campione riproducibile come questo avviene su un enorme applicazione
  • Quando dico 'a volte' voglio dire con lo stesso metodo nella mia applicazione ma durante varie istanze. Inoltre, quando fallisce una volta durante l'esecuzione, fallirà ogni volta per quell'istanza dell'applicazione.

Update 2

L'applicazione in questione utilizza una quantità di memoria e di huuuuuge gira su 32bit XP. Sto pensando che forse è un TypeLoadException o OutOfMemoryException che è in qualche modo ingoiato (ma non riesco a vedere come, come ho provato con le eccezioni first-chance attivate nel debugger). Aggiornamento


incontrato lo stesso problema solo ora. Ecco l'analisi dello stack: enter image description here Il codice fino a questo punto è letteralmente:

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

(prima, era ..CreateTrade(typeof(MyTradeType)) così non ho potuto davvero dire se il typeof restituito null)

Quindi, sembra che typeof() non restituisca null ma è impostato su null quando termina nel metodo CreateTrade.

L'eccezione (NullReferenceException) ha una proprietà HResult di 0x80004003 (Invalid pointer). Una chiamata a System.Runtime.InteropServices.Marshal.GetLastWin32Error() (nella Finestra Immediata) restituisce 127 (The specified procedure could not be found). Ho cercato nella finestra Modules e il modulo che contiene questo tipo e questo metodo è stato caricato e non sembra che ci siano errori di caricamento.


+1

Interessante. Puoi fornire un esempio di codice che mostri il problema? – Amy

+1

"Occasionalmente" significa sporadicamente sulla stessa chiamata o in determinati luoghi ma non in altri? – BoltClock

+4

Io per primo non riesco ad immaginare in alcun modo che questo possa mai accadere. – leppie

risposta

2

Da typeof(T) è un operatore fase di compilazione non sarà coinvolto il carico-tempo del complesso.

Sarebbe interessante vedere un codice che lo dimostra.

Ancora più interessante vederlo a volte ea volte no.

Una prima risposta potrebbe essere: utilizzare GetType() su un'istanza.

+1

La risoluzione è tempo di compilazione, ma il caricatore carica il modulo contenente IFoo all'inizio del metodo. –

4

Il caricamento della DLL non è riuscito per qualche motivo? Hai controllato lo fusion logs.

Suppongo che ciò potrebbe causare più problemi di questo, ma se si sta effettuando questo controllo prima di utilizzare qualsiasi cosa dall'assemblaggio, potrebbe nascondere altri problemi.

1

typeof determina il tipo durante il periodo di compilazione. Quindi, anche se restituisce null, dovrebbe restituire null sempre. Perché il comportamento non cambia durante il runtime. Dare qualche frammento di codice, alcune altre cose sono rotte.

+0

Ma non riesco a vedere come può restituire null. Sto provando a riprodurre un'app di test che utilizza molta memoria poiché penso che sia un'eccezione di caricamento del tipo che viene ingerita. –

+1

@Steve Non intendevo che typeof restituirà null. Ma poiché il tipo viene dedotto durante la compilazione, il comportamento dovrebbe rimanere lo stesso durante il runtime. Non può comportarsi in modo diverso in momenti diversi. Per quanto ne so, typeof non ha mai restituito nulla. – ferosekhanj

1

Questo è abbastanza possibile e molto facile da riprodurre. typeof(T) restituirà null se il tipo è stato creato in memoria. tramite System.Reflection.Emit per esempio.

1

Stavo riscontrando questo problema nel mio progetto VSPackage quando si utilizza typeof (MyClass) nel costruttore del pacchetto. Ho spostato il mio codice sul metodo Initialize() sottoposto a override e quindi ha funzionato correttamente, quindi sembra che l'assembly non sia ancora caricato potrebbe essere un fattore in questo errore alcune volte. Noterò anche che il mio VSPackage viene caricato in fase di esecuzione in Visual Studio tramite MEF, quindi questo probabilmente non è il tipico scenario, ma ho ancora pensato di parlarne.

Problemi correlati