2011-01-20 10 views
21

場合によっては、typeof(Foo)がnullを返すことがあります。なぜこれが起こるのだろうか?なぜtypeof(Foo)はnullを返すのですか?

これはC#、.NET 3.5です。

まだ読み込まれていない型を含むアセンブリとは関係があるかもしれないと思っていましたが、テストアプリケーションでは、メソッドの最初にロードされていることが示されています(typeofが使用されています)。

アイデア?


アップデート1

  • これは巨大なアプリケーション
  • 私は「たまに」と言うとき、私は自分のアプリケーションでも同じ方法で意味に起こるように私は、再現性のサンプルを提供することはできません様々な例の間に。また、実行中に1度失敗すると、アプリケーションのそのインスタンスのたびに失敗します。

アップデート2

問題のアプリケーションがメモリのhuuuuuge量を使用し、32ビットXP上で動作します。私はおそらくTypeLoadExceptionまたはOutOfMemoryExceptionが何らかの形で飲み込まれていると思っています(しかし、私はデバッガで最初の例外を有効にしてこれを試したので、どのように見えませんか)。


アップデート3

ちょうど今、同じ問題に遭遇しました。ここでスタックトレースです: enter image description here この時点までのコードは文字通りです:

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

typeofがnullを返された場合、私は実際に言うことができなかったので前に、それは..CreateTrade(typeof(MyTradeType))だった)

したがって、typeof()はnullを返しません。ですが、それはメソッドで終了するまでにnullに設定されているです

例外(NullReferenceException)はHResultプロパティが0x80004003Invalid pointer)です。 System.Runtime.InteropServices.Marshal.GetLastWin32Error()(イミディエイトウィンドウ内)の呼び出しは127 (The specified procedure could not be found)を返します。 Modulesウィンドウを調べましたが、このタイプとメソッドを含むモジュールがロードされていて、ローダーエラーがないように見えます。 typeof(T)ので


+1

興味深い。問題を示すコードサンプルを提供できますか? – Amy

+1

「時折」とは、同じ通話や特定の場所では散発的に意味しますか? – BoltClock

+4

私は1つはこれが起こることができる方法を想像することはできません。 – leppie

答えて

2

アセンブリのローディング時間が関与しないであろうコンパイル時演算子です。

これを示すコードを見ると面白いでしょう。

さらに面白いことがあります。

最初の答えは:GetType()をインスタンスに使用します。

+1

解決はコンパイル時ですが、ローダーはメソッドの先頭にIFooを含むモジュールをロードします。 –

4

何らかの理由でdllをロードできませんでしたか?あなたはfusion logsをチェックしましたか?

私はこれがこれ以上の問題を引き起こすと思いますが、アセンブリから何かを使用する前にこのチェックを行っていると、それ以上の問題は隠れている可能性があります。

1

typeofは、コンパイル時の型を決定します。したがって、nullを返す場合でも、常にnullを返す必要があります。実行時に動作が変更されないためです。いくつかの他のものが壊れているいくつかのコードスニペットを与えます。

+0

しかし、nullを返す方法はわかりません。私はそれが飲み込まれている型のロード例外だと思うように、メモリの多くを使用するテストアプリケーションを再現しようとしています。 –

+1

@ Steve typeofがnullを返すわけではありませんでした。しかし、コンパイル時にタイプが推測されるため、ランタイム中に動作は同じに維持されます。それは、異なる時に異なって行動することはできません。私の知る限り、typeofはnullを返すことはありません。 – ferosekhanj

1

これは非常に可能であり、再現するのが非常に簡単です。 typeof(T)は、型がメモリ内に作成されている場合はnullを返します。 から例えばSystem.Reflection.Emitまでです。

1

パッケージのコンストラクタでtypeof(MyClass)を使用すると、私のVSPackageプロジェクトでこの問題が発生していました。私はオーバーライドされたInitialize()メソッドに自分のコードを移動し、それはうまくいきましたので、アセンブリがまだロードされていないように見えます。私のVSPackageは、MEFを介してVisual Studioに実行時にロードされることにも注意してください。これはあなたの典型的なシナリオではないかもしれませんが、それでも私はそれを言いたいと思います。

関連する問題