it-swarm-ja.com

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

私は、Visual Studio 2008の.NETプラットフォームのビルドオプションに関していくつか混乱しています。

「Any CPU」コンパイルターゲットとは何ですか。また、どのようなファイルが生成されますか?私はこの "Any CPU"ビルドの出力実行ファイルを調べて、それらがx86実行ファイルであることを発見しました(それが来るのを見ないでしょう!)。それで、x86への実行可能ファイルのターゲティングと "Any CPU"の間に違いはありますか?

私が気づいたもう一つのことは、マネージC++プロジェクトはオプションとしてこのプラットフォームを持っていないということです。何故ですか?これは、 "Any CPU"実行可能ファイルが普通の32ビットの実行可能ファイルであるという私の疑いが正しいということですか?

462
galets

AnyCPUアセンブリは、64ビットプロセスにロードされると64ビットコードに、32ビットプロセスにロードされると32ビットにJITします。

CPUを制限することで、次のようになります。アセンブリによって使用されているもの(管理されていない可能性があるもの)があり、32ビットまたは64ビットが必要です

363
AnthonyWJones

大事なことはほとんど言ってあると思いますが、1つ追加することを考えました。Any CPUとしてコンパイルし、x64プラットフォームで実行すると、勝ちますアプリはWOW64で起動されていないため、32ビットDLLをロードできませんが、それらのDLLはそこで実行する必要があります。
あなたがx86としてコンパイルするならば、x64システムはWOW64であなたのアプリを実行するでしょう、そしてあなたは32ビットdllをロードすることができるでしょう。
したがって、依存関係がどちらの環境でも実行できる場合は "Any CPU"を選択し、32ビットの依存関係がある場合はx86を選択してください。 Microsoftのこの記事では、これについて少し説明しています。

/ CLRIMAGETYPE(CLRイメージの種類を指定)

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

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

297

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

私自身の経験からすると、x86とx64の両方のプラットフォームで動作するプロジェクトを構築しようとしていて、特定のx64最適化がない場合は、ビルドを「x86」と明確に変更します。

これの理由は時々あなたが衝突するいくつかのDLLかx64環境でクラッシュするWOWを巻き取るいくつかのコードを得ることができるということです。特にx86を指定することで、x64 OSはアプリを純粋なx86アプリとして扱い、すべてが円滑に動作するようにします。

50
Dillie-O

Visual Studio .NETプラットフォームターゲットの説明を確認してください。

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

上記のリンクが壊れていることが報告されているので、ここで同様の説明を伴う別の記事があります。.NET 4.5およびVisual Studio 11以降のAnyCPUの実際の意味

45
DCNYAM

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

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

疑いがある限り、Visual Studio 2008のコマンドラインに行き、以下を実行してください。

dumpbin YourProgram.exe /headers

それはあなたにあなたのプログラムのちょっとさに加えてもっとたくさんのことを教えてくれるでしょう。

39
AngryHacker

「C#を介したCLR」を予約していることの功績、これを参照してください。

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

enter image description here

33
Ivan

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

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

31
Adam Tegen

この記事を読むことをお勧めします

AnyCPUを使用する場合、意味は次のとおりです。

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