2011-01-20 14 views
21

Czasami widzę, że typeof(Foo) zwraca wartość null. Dlaczego tak się stało?Dlaczego funkcja typeof (Foo) kiedykolwiek zwróci wartość null?

To jest w języku C#, .NET 3.5.

Pomyślałem, że może to mieć coś wspólnego z zestawem zawierającym typ, który nie został jeszcze załadowany, ale aplikacja testowa pokazuje, że zespół jest ładowany na początku metody, gdzie jest używany typeof.

Wszelkie pomysły?


Aktualizacja 1

  • Nie mogę zapewnić powtarzalną próbkę jak to dzieje się na ogromnym aplikacji
  • Kiedy mówię „czasami” mam na myśli w ten sam sposób w mojej aplikacji ale w różnych przypadkach. Ponadto, gdy raz się nie powiedzie, będzie za każdym razem niepowodzeniem dla tej instancji aplikacji.

Aktualizacja 2

danego zastosowania używa huuuuuge ilość pamięci i działa na XP 32bit. Myślę, że może to wyjątek TypeLoadException lub OutOfMemoryException, który jest w jakiś sposób połknięty (ale nie widzę jak, jak próbowałem tego z włączonymi w debugerze wyjątkami pierwszej szansy).


Aktualizacja 3

Ran w tej samej kwestii właśnie teraz. Oto ślad stosu: enter image description here Kod do tego punktu jest dosłownie:

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

(wcześniej było ..CreateTrade(typeof(MyTradeType)) tak nie mogłem rzeczywiście powiedzieć, czy typeof powrócił zerowy)

Wygląda na to, że typeof() nie zwraca wartości null, ale jest to ustawianie wartości pustej przed zakończeniem w metodzie CreateTrade.

Wyjątek (NullReferenceException) ma właściwość HResult z 0x80004003 (Invalid pointer). Połączenie z numerem System.Runtime.InteropServices.Marshal.GetLastWin32Error() (w okienku natychmiastowym) zwraca 127 (The specified procedure could not be found). Zajrzałem do okna Moduły, a moduł zawierający ten typ i metodę został załadowany i nie wygląda na to, aby wystąpiły jakiekolwiek błędy modułu ładującego.


+1

Interesujące. Czy możesz podać przykład kodu, który demonstruje problem? – Amy

+1

Czy "sporadycznie" oznacza sporadycznie w tym samym połączeniu lub w niektórych miejscach, ale nie w innych? – BoltClock

+4

Nie można sobie wyobrazić, by tak się mogło kiedykolwiek wydarzyć. – leppie

Odpowiedz

2

Od typeof(T) jest kompilacji operator czas załadunku w czasie montażu nie będzie zaangażowany.

Byłoby interesujące zobaczyć kod, który to demonstruje.

Jeszcze ciekawiej zobaczyć, że zdarza się czasem, a czasem nie.

Pierwsza odpowiedź może być: użyj GetType() dla instancji.

+1

Rozdzielczość jest czasem kompilacji, ale program ładujący ładuje moduł zawierający IFoo na początku metody. –

4

Czy załadowanie dll nie powiodło się z jakiegoś powodu? Czy sprawdziłeś numer fusion logs?

Założę, że spowodowałoby to więcej problemów niż tylko to, ale jeśli robisz to sprawdzanie przed użyciem czegokolwiek z zespołu, może to być ukrywanie jakichkolwiek dalszych problemów.

1

typeof określa typ podczas kompilacji. Więc nawet jeśli zwróci wartość null, powinna zawsze zwracać wartość null. Ponieważ zachowanie nie zmienia się w czasie wykonywania. Podaj fragment kodu, niektóre inne rzeczy są zepsute.

+0

Ale nie widzę, jak można zwrócić wartość null. Próbuję odtworzyć aplikację testową, która używa dużo pamięci, ponieważ myślę, że jest to wyjątek obciążenia typu, który jest połknięty. –

+1

@Steve Nie chciałem powiedzieć, że typeof zwróci wartość null. Ale ponieważ typ został wydedukowany podczas kompilacji, zachowanie powinno pozostać takie samo podczas działania. Nie może zachowywać się inaczej w różnym czasie. O ile mi wiadomo, typeof nigdy nie zwrócił wartości null. – ferosekhanj

1

Jest to całkiem możliwe i bardzo łatwe do odtworzenia. typeof(T) zwróci wartość null, jeśli typ został utworzony w pamięci. Na przykład przez System.Reflection.Emit.

1

Miałem ten problem w moim projekcie VSPackage przy użyciu typeof (MyClass) w konstruktorze pakietu. Przeniosłem swój kod do zastąpionej metody Initialize(), a następnie działało poprawnie, więc wygląda na to, że zespół nie jest jeszcze załadowany, może być przyczyną tego błędu. Zauważam też, że mój VSPackage jest ładowany w czasie wykonywania do Visual Studio przez MEF, więc prawdopodobnie nie jest to twój typowy scenariusz, ale wciąż myślę, że wspomnę o tym.

Powiązane problemy