きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

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のアーキテクチャに依存するような実装が必要な場合は、それぞれの環境にあったプラットフォームターゲットを選択する必要があるようです。