5

私が言おうとしていることのいずれかが意味をなさないか、明らかなことを見落としている場合はお詫び申し上げます.CLRの内部に関する私の知識はむらがあります.

私が正しく理解していれば、VS2K5 で 'AnyCPU' のソリューションをビルドする (または、これらの設定でその .sln ファイルに MSBuild を指定する) と、バイナリは MSIL までしかコンパイルされません。その後、32 ビット プラットフォームで実行された場合は 32 ビットに JIT され、x64 で実行された場合は 64 ビット コードになります。

DLL は Web アプリに使用され、W3WP.exe プロセスでホストされます。Process Explorer は、W3WP が 64 ビット プロセスであることを示しています。

しかし、Process Explorer を使用して DLL ビューでこれらの DLL の 1 つのプロパティを確認すると、「Image: 32-bit」と表示されます。何を与える?

問題の dll に対して corflags を実行すると、次のように表示されます: ILONLY 1 , 32BIT 0 but PE PE32 。私の理解では、これははい、IL までしかコンパイルされていません。いいえ、32 ビットまたは 64 ビットに限定されていませんが、完全には明確ではありません。PE32 フラグは、上記のように 32 ビットとして表示されることと関係がありますか?

4

2 に答える 2

5

あなたの質問はこの質問に関連しています。プロセス エクスプローラーに表示されているのはイメージのタイプです。これは、アセンブリのcorflagsで指定された「ランタイム互換性」タイプとは異なります。

「Any Cpu」を設定するポイントは、ネイティブ イメージとアセンブリの両方で最も一般的な分母を強制することです。これにより、.NET の Windows ブートストラップが現在のプラットフォームに最も適したランタイムの種類を選択できるようになります。

したがって、あなたの例では、「任意の CPU」アセンブリ (アセンブリの CorFlags で指定) を含む 32 ビット イメージ (PE ヘッダーで指定) があります。

于 2008-11-22T21:25:27.417 に答える
2

その後、32 ビット プラットフォームで実行された場合は 32 ビットに JIT され、x64 で実行された場合は 64 ビット コードになります。

そうです、 AnyCPU 用にコンパイルされた同じexeを実行することで確認できます:

sizeof(IntPtr) == 4 //32 ビットでは true

sizeof(IntPtr) == 8 //64 ビットでは true

ただし、アセンブリが 32 ビット プラットフォーム専用にコンパイルされたプロセスで参照されている場合は、32 ビットに変換されます (64 ビット Windows の WOW で実行されます)。

于 2008-10-29T15:07:05.267 に答える