Visual Studioの「Any CPU」ターゲットとはどういう意味ですか?


496

Visual Studio 2008の.NETプラットフォームビルドオプションに関連する混乱があります。

「Any CPU」コンパイルターゲットとは何ですか。また、どのような種類のファイルが生成されますか?この "Any CPU"ビルドの出力実行可能ファイルを調べたところ、それらはx86実行可能ファイルであることがわかりました(この実行は確認されません!)。それでは、実行可能ファイルをx86と「任意のCPU」のどちらに向けるかに違いはありますか?

私が気づいたもう1つのことは、マネージC ++プロジェクトにはこのプラットフォームがオプションとしてないことです。何故ですか?それは、「すべてのCPU」実行可能ファイルが単純な32ビットの実行可能ファイルであるという私の疑いが正しいことを意味しますか?


4
使用するプラットフォームの対象を決定する際に考慮すべきもう一つは:目標ならばスタートアッププロジェクトがありAny CPU、あなたは64ビットOS上で走っている、あなたはに能力失う編集をしていきデバッグ中。(64ビットプロセスを効果的にデバッグしています)。デバッグ中にスタートアッププロジェクトターゲットx86を作成してこれを回避できます。(スタートアッププロジェクトから参照されるアセンブリをターゲットに続けることAny CPU
クリスティアン・ダイアコネスキュー

8
VS2013で@CristiDiaconescuエディットコンティニュが可能になりました
ms007 2013年

後者のターゲットビット数を設定すると、プラットフォームに応じて、消費するアプリケーションの可用性に影響を与える可能性があるため、プロジェクトがアプリケーションであるか、クラスライブラリであるかについて、いくつか注意が必要です。ロードエラーを回避するために設定しなければならないアプリケーションx86によってライブラリが消費され、これに遭遇しました。AnyCPUPrefer 32-bit
SteveCinq 2018

回答:


386

AnyCPUは、 64ビットプロセスにロードされたときに32ビット、32ビットプロセスにロードされたときにアセンブリ64ビットコードにJITであろう。

CPUを制限すると、次のようになります。


3
では、J ++をC ++でx64に変換するアセンブリをどのように生成しますか?
ガレット2009

50
C ++プロジェクトはネイティブコードにコンパイルされるため、JITコンパイラーは関与しません...したがって、求めていることを行うことはできません。
cplotts

7
@cplotts:@galetsが3か月前にこの質問をしたため、彼があなたの答えを見ることはほとんどありません。コメントに@galetsプレフィックスを付けて、ここにあるのと同じようにして、彼があなたの答えについてアラートを受け取るようにします。
AnthonyWJones 2010年

4
@AnthonyWJones一般的には正しいですが、この場合のようにユーザーが質問のOPである場合を除いて、すべてのコメントが通知されます。
Mark Hurd 2013年

12
@MarkHurd実際、この場合、OPには通知されません。OP は、@構文で明確にpingされない限り、回答に対するコメントの通知を受け取りません。OPは、元の質問に追加されたコメントの通知のみを自動的に受け取ります。
RSW 2013

322

あなたのようにコンパイルした場合:私は重要なもののほとんどが言われてきたと思うが、私はちょうど私が一つのことを追加しようと思いました任意のCPU、x64プラットフォーム上で、実行、その後、あなたは32ビットのDLLファイルをロードすることができませんアプリケーションがWoW64で起動されていないためですが、これらのDLLファイルはそこで実行する必要があります。

x86としてコンパイルすると、x64システムはアプリケーションをWoW64で実行し、32ビットDLLファイルをロードできるようになります。

したがって、依存関係がどちらの環境でも実行できる場合は「すべてのCPU」を選択する必要がありますが、32ビットの依存関係がある場合はx86を選択します。マイクロソフトのこの記事では、これについて少し説明しています。

/ CLRIMAGETYPE(CLRイメージのタイプを指定)

ちなみに、この他のMicrosoftのドキュメントでは、x86の方が移植性の高い選択肢であることに同意しています

x86を選択することは、ほぼすべてのデバイスで実行されるため、一般にアプリパッケージの最も安全な構成です。一部のデバイスでは、Xboxまたは一部のIoT Coreデバイスなど、x86構成のアプリパッケージが実行されません。ただし、PCの場合は、x86パッケージが最も安全な選択肢であり、デバイス展開の範囲が最大になります。Windows 10デバイスの大部分は、x86バージョンのWindowsを実行し続けます。


2
おそらく、回答を編集して、特定のDLLが32ビットのみであるかどうかを判断する方法を示すことができます。私の知る限り、これはそれを理解するはずです。単にx86だけではなく、「任意のCPU」でもあるDLLを期待していると思います。
Dan W

+1は重要な違いです。32ビットの依存関係を使用する必要がありました(そのように識別されませんでした)。不可解なランタイムエラーメッセージを理解できませんでした。直感的にcpuターゲットが変更され、動作しましたが、「なぜ」を探していました。すべてが64ビットであり、非互換性の問題が16ビットと32ビットのように古臭く感じられるようになると、いつかいいでしょう。
ジェラルドデイビス

2
@GeraldDavis-同意します。皮肉なことに、32ビットと64ビットの依存関係を混在させることができないという技術的な理由はなく(CLRにサンクレイヤーがないだけです)、. NETの初期の頃、ビットを見たときはがっかりしました。配備するときは、まだ考慮すべき点がありました(これがVM / JITであることを考えると、もう少し付加価値を提供する機会になったでしょう)。
codenheim 2014年

1
@mrjoltcola:さらに悪いのは、Microsoftがレジストリのエントリを画面の色やデフォルトの設定などを制御していても、32ビットと64ビットのユニバースに分割する必要があるとは思えない理由でMicrosoftが決定した方法です。
スーパーキャット2014年

これが私が探していた答えです…ありがとう!
Daminion SoftwareのMurat、2014

52

ここでは、さまざまなビルドターゲットを説明する簡単な概要示します

私自身の経験から、x86とx64の両方のプラットフォームで実行されるプロジェクトをビルドする場合で、特定のx64最適化がない場合は、ビルドを「x86」と具体的に言うように変更します。

これは、x64環境で衝突するDLLファイルや、WoWのクラッシュを引き起こすいくつかのコードを取得できる場合があるためです。特にx86を指定することにより、x64 OSはアプリケーションを純粋なx86アプリケーションとして扱い、すべてがスムーズに実行されるようにします。


37
これは、サーバー環境向けに作成していて、アプリケーションで2GBを超えるメモリを使用できるようにしたい場合、ひどいことになる可能性があります。また、いつかはパイプラインから外れる可能性のあるx64 JIT最適化をオプトアウトしています。
オースティンハリス

AnyCPUコンパイルで発生したランタイムの問題の量は、誰かが両方で動作するバイナリを明示的に要求しない限り、ビルドオプションとしての使用を停止するために必要だったすべての正当化です。10年以上の間、x64を超えるx86バイナリをリクエストする人はいませんでした。
kayleeFrye_onDeck

2
「x86を具体的に指定することにより、x64 OSはアプリを純粋なx86アプリとして扱い、すべてがスムーズに実行されるようにします。」-申し訳ありません、私は同意しません。x64 OSは引き続きWOW64内でx86アプリを実行します
Mandeep Janjua 2018年

これは、それが与える影響を完全に理解していない人へのちょうど悪いアドバイスです。@AustinHarrisが良い例です。ほんの数GBのRAMに制限されたWebワーカープロセスを想像してみてください(最近、本番環境でこれに対処する必要がありました)。
rgoliveira

47

Visual Studio .NET Platform Target Explainedの記事をご覧ください

デフォルト設定の「すべてのCPU」は、アセンブリが現在実行されているCPUでネイティブに実行されることを意味します。つまり、64ビットマシンでは64ビット、32ビットマシンでは32ビットとして実行されます。アセンブリが64ビットアプリケーションから呼び出された場合、64ビットアセンブリとして実行されます。

上記のリンクは壊れていると報告されているので、同様の説明が記載された別の記事を次に示します。


1
リンクが壊れています—パークドメインに移動しています。
Jon Adams

同様の情報を持つ2番目の記事へのリンクを追加しました。ドメインが再びアクティブになる場合に備えて、最初のリンクを残しました。
DCNYAM 2017


39

「任意のCPU」とは、プログラムの起動時に、.NET FrameworkがOSのビット数に基づいて、プログラムを32ビットと64ビットのどちらで実行するかを判断することを意味します。

x86Any CPUには違いがあります。x64システムでは、X86用にコンパイルされた実行可能ファイルは32ビットの実行可能ファイルとして実行されます。

疑いがある限り、Visual Studio 2008のコマンドラインに移動して、次のコマンドを実行します。

dumpbin YourProgram.exe /headers

それはあなたのプログラムのビットネスに加えて、もっとたくさんのことを教えてくれます。


7
「任意のCPU」に組み込まれている場合、ダンプビンヘッダーでは32ビットとして表示されます。
Kirbinator 2013年

34

任意のCPUは、任意のプラットフォームで動作することを意味します。これは、マネージコードがJavaに似ているためです。実行時に.NET Frameworkによって解釈されるバイトコードにコンパイルされると考えてください。

C ++は、プラットフォーム固有のマシンコードにコンパイルされるため、このオプションはありません。


12
他の誰もしなかった質問の一部に答えるための+1(オプションとしてAnyCPUを持たないC ++プロジェクトについて)。
cplotts 2010年

C ++ / CLIは、マシンコードなしでILコードにコンパイルできます(/ clr:pure)。しかし、sizeof(void *)は、C ++ではコンパイル時の定数である必要があります。したがって、マシンコードが含まれていない場合でも、32ビットと64ビットで同時に動作するバイナリを作成することはできません。
ダニエル

5

この投稿を読むことをお勧めします。

AnyCPUを使用する場合、セマンティクスは次のとおりです。

  • プロセスが32ビットWindowsシステムで実行される場合、32ビットプロセスとして実行されます。CILはx86マシンコードにコンパイルされます。
  • プロセスが64ビットWindowsシステムで実行される場合、32ビットプロセスとして実行されます。CILはx86マシンコードにコンパイルされます。
  • プロセスがARM Windowsシステムで実行される場合、32ビットプロセスとして実行されます。CILはARMマシンコードにコンパイルされます。

8
「32ビット優先」が選択されている場合のみ。
フロリアン冬

これはVisual Studio 11以降のデフォルトです
Moerwald '19年

@Moerwald私はそれが修正されたバグだったと思います。mamczasが参照する投稿を読んだ場合 、著者は「現在のVisual Studio UIでは、「32ビットを優先」はグレー表示され、チェックが外されていますが、実際には有効になっています...」と書いています。私のバージョンのVS(15.8.0)では、オプションはまだ灰色でチェックされていませんが、期待どおりに機能します(コンパイルされたアセンブリのCorFlagsセクションでフラグ32BITPREF = FALSE)
Raikol Amaro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.