2012-04-15 5 views
1

私はIntPtr.Sizeが64ビットまたは32ビットをチェックできることを知っています。異なる環境の32ビットコードでチェックしますか?

または

  • .NETコンパイルされたバージョン(私はにコンパイルすることができ、オペレーティング・システム・プラットフォームに係る

    ですIntPtr.Size:(8 || 4バイト)

    質問32または64)

この表を確認して修正できますか?

compiled to | running OS | IntPtr.Size 
______________________________________ 
     64    32  wont run 
     64    64   8 
     32    32   4 
     32    64   4 

答えて

2

の表は、限り、あなたが列「で実行すると、」OSではなく、CPUのbit化のbit化を指して、正しいです。 32、64およびAnyCPU:

compiled to | running on  | IntPtr.Size 
___________________________________________ 
     64  | 32   | won't run 
     64  | 64   | 8 
     32  | 32   | 4 
     32  | 64   | 4 
     AnyCPU | 32   | 4 
     AnyCPU | 64   | 8 
+3

.Net 4.5には新しいオプションがあります。[任意のCPU 32ビットが優先](http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/what-anycpu-really-手段として - ネット4-5およびビジュアルスタジオ11.aspx)。 – svick

+0

@Polynomialあなたの答えを編集して申し訳ありません。私はそれが私のテーブルだと思った...復帰... –

+0

質問:私は64ビットプロセスです。私も32ビットにコンパイルされたDLLを持っています。このdllには、パラメータintとして取得するメソッドがあります。 DLLは32ビットにコンパイルされているので、intのサイズは4バイトです。しかし、私の64ビットプロセスが独自のintを使ってこの関数を呼び出すと、method8バイトintを送信します...何が起こりますか? –

0

それはOpertaingシステムplatofrmに依存し、ないターゲット・編集タイプ

は、実際には3つの選択肢があることに注意してください。

+0

@Polynomialは間違っていますか? –

+0

ターゲットのコンパイルタイプが違います。 32ビットにコンパイルして64ビットのOSで実行すると、64ビットのコードは取得されません。 – Polynomial

+0

@RoyiNamir:それはまさに私には同じように思える。だから32/64ビットはOSに関するもので、プロセッサではない。そうではない? – Tigran

3

私はこのような表を作成したい:

 target |  OS  | IntPtr.Size 
______________________________________ 
     x64   32  wont run 
     x64   64   8 
    AnyCPU   32   4 
    AnyCPU   64   8 
     x86   32   4 
     x86   64   4 

をあなたは常にAnyCPU、決してのx64をターゲットにする強力なヒントで。 32ビットマシンコードでのみ使用可能なアンマネージコード(通常はCOMサーバー)を使用する必要があることがわかっている場合は、x86をターゲットにしてください。

+0

'running on'はOSで、CPUではなく...そうですか? –

+0

外部ベンダーからx86にコンパイルされた.NETライブラリを扱うなど、x86を明示的に設定するための他のユースケースがあることに注意してください。私は32ビットマシンで開発し、ターゲットをAnyCPUのままにしておき、32ビットライブラリがロードされないため、64ビットのカスタママシンでコードがクラッシュするのを見ました。 – Polynomial

+0

これは修正可能です。corflags.exeを実行して変更してください。 –

1

これは正しい順序で取得する必要があります。 コードをILにコンパイルすると、32,64、または任意のCPUを選択できます。 ILがJITをネイティブにコンパイルすると、PEヘッダーにあることがわかります。ビットレートを強制した場合、64ビットを強制して32ビットOSを使用している場合を除いて、OSのビット数に合わせてJITが実行されます。

sizeofはILがコンパイルされたネイティブコードのビット数を示します。

あなたはあなたに(64ビットチップ上の32ビットOSを)プロセッサのbit化を伝えるためにそれに頼ることはできません

、あなたはあなたのOS(32ビットプロセスののbitnessを伝えるためにそれに頼ることはできません64ビットOS)

もし8に戻ってくるのであれば、64ビットOSである必要があります。したがって、他の方法はありません。なぜなら、128ビットのチップとOSになるまでです。

戻ってくる場合は、OSやチップのビット数を調べるために別のチェックを行う必要があります。

関連する問題