きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Build × プラットフォームターゲット × 選択

最近こんな質問を受けてまともに答えられなかったので、調べた結果を備忘録として残しておきます。

質問はこんな感じでした。
Q :アプリケーションのプラットフォームターゲットを何にしたらよいか?

・・・Any CPUでいいじゃん。と思いましたが、
実行環境が64ビット端末だから、x64のほうが最適化されるのではないか。
という意見に対して、反応ができませんでした。


f:id:kinakomotitti:20171130224605p:plain
図:例の設定画面


ちゃんと見たことがなかったですが、初期設定では、【32ビット優先のAny CPU】となっています。
これは、32ビットの環境では32ビットアプリとして動き、64ビットの環境ではWoW64という64ビット版のWindowsで32ビットアプリケーションを動かすための技術を使って動きます。
32ビットの優先をなくしたときでも、Any CPUとしたら、32ビット環境では32ビットとして動作し、64ビット環境では64ビットアプリとして動作します。

逆にx86, x64などに設定したらどうなるかというと、
x86のときは、【32ビット優先のAny CPU】と同じような結果になります。
x64のときは、64ビット環境でのみ動作するモジュールが生成されます。

Windowsでは、実行可能ファイル(EXE)を実行するとき、EXEファイルのヘッダー情報をみて、アプリが32ビット or 64ビットのどちらのアドレス空間を必要としているかを判定します。
上記の設定は、このEXEを実行するときに必要となる情報を設定するものです。


よって、x86だと最適化されるという機能を勝手に妄想実装するのは間違いで、デフォルトの設定のまま【32ビット優先のAny CPU】としてビルドすればよいということがわかりました!
明日伝えておこう・・・


なお、特定のCPUのアーキテクチャに依存するような実装が必要な場合は、それぞれの環境にあったプラットフォームターゲットを選択する必要があるようです。