Visual Studioの[32ビット優先]設定の目的は何ですか、また実際にはどのように機能しますか?


204

ここに画像の説明を入力してください

必要なときにコンパイラーが64ビット用にコンパイルする方法をコンパイラーがどのように自動的に認識するかは不明です。自信を持って32ビットをターゲットにできる場合、それはどのようにしてわかりますか?

私は主に、コンパイラーがコンパイル時にどのアーキテクチャーをターゲットにするかを知る方法に興味があります。それはコードを分析し、見つけたものに基づいて決定を下しますか?



ああ、ありがとう。以前は見ていませんでした。コンパイラーがどのアーキテクチャーをターゲットにするかを自動的に認識する方法について、私はまだ興味があります。何か案は?
アーロン

回答:


219

Microsoftのブログエントリには、AnyCPUが.NET 4.5およびVisual Studio 11に関して実際に意味するもの

.NET 4.5およびVisual Studio 11では、チーズが移動されました。ほとんどの.NETプロジェクトのデフォルトはAnyCPUですが、AnyCPUには複数の意味があります。AnyCPUには、新しいデフォルトである「Any CPU 32ビット優先」というサブタイプが追加されています(全体として、/ platform C#コンパイラスイッチには、x86、Itanium、x64、anycpu、anycpu32bitpreferredの5つのオプションがあります。 )。AnyCPUの「32ビット優先」フレーバーを使用する場合、セマンティクスは次のとおりです。

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

次に、「任意のCPU 32ビット優先」と「x86」の違いはこれだけです。x86にコンパイルされた.NETアプリケーションはARM Windowsシステムで実行できませんが、「任意のCPU 32ビット優先」アプリケーションです。正常に実行されます。


12
+1。また、「32ビットを優先」チェックボックスは、.NET 4.5以降の実行可能プロジェクトでのみ有効です。
Lee Grissom

12
anycpu32bitspreferredのもう1つの利点は、64ビットで実行されている別の.exeがそのアセンブリをロードできることです。
ブルーノマルティネス

30
個人的には、デフォルトでこれをオフにするツール設定なしで設定するのは恐ろしいことだと思います。さらに悪いことに、オフにしない限りcsprojファイルにないため、検索できません!ほとんどの人が32ビットOfficeをインストールしているx64マシンでは、CPUAnyとOffice Automationの非互換性があるために追加されたと思われます。
デイブ

6
@BrianDavidBermanがあります。falseを32に設定しますが、preferredに設定し、64ビットマシンでx64またはAny CPUを設定した場合です。
Lex Li

6
x86と任意の32ビットCPUの違いは、後者の場合、実行可能ファイルにlargeaddressawareフラグが設定されていることです。つまり、64ビットOSで実行されている32ビットプロセスは、x86モードでは2GBのメモリを、任意のCPU 32ビット優先モードでは4GBのメモリを使用できます。
ニック

6

簡単な答えは次のとおりです。

アプリケーションアーチ。

注: AnyCPU-32bitPreferredは、.Netバージョン4.5以降でのみ使用できます。


2
「32ビットとして実行」と「WoW64」として実行の違いは何ですか。WoW64 = "Windows64上のWindows(32ビット)"だと思い、32ビットアプリケーションを実行するために必要でした。
Peter Cordes

これにはソースがありますか?どこか他の場所ではまだデフォルトがanycpu32bitpreferredであると教えられています。これは、64ビットのWindowsマシンで実行している人にとっては大きな違いです(それはたくさんあります)。
Ran Sagy

@RanSagyは、新しいプロジェクトを作成してチェックするだけでテストできますProject -> Properties -> Build tab -> Platform target。ただしAnyCPU-32bitPreferred、.Netバージョン4.5以降でのみ使用できます。そのため、デフォルトはAnyCPUです。
Yousha Aleayoub

場合によっては、私の物が灰色になっていた。.net 4.5+または.net standard / core(または実際にはMSBuild 16)で何が起こるかに関するドキュメントがあることを望んでいました
Ran Sagy

-1

その理由は、64ビットアプリケーションでより多くのメモリを使用したくない場合です。つまり、アプリケーションがAnyCPUの場合、32ビットとして実行する必要があります。

さらに追加するために、Visual Studioの設定は特定のCLRを対象としています。

Visual Studioは、32ビットバージョンのCLRをx86コンピューターにインストールし、32ビットバージョンと適切な64ビットバージョンのCLRの両方を64ビットWindowsコンピューターにインストールします。(Visual Studioは32ビットアプリケーションであるため、64ビットシステムにインストールすると、WOW64で実行されます。)

記事64ビットアプリケーションMSDN)を参照してください。


1
それが正確かどうかはわかりません。同様に、32または64に関係なく.NET実行可能ファイルがプロセスあたり約2 GBに制限されていることは私の理解です。
JP Richardson

1
私の答えを編集しました。しかし、これがあなたが探しているものであるかどうかはわかりません:)
ペルー

2
@Aaron、コンパイラーは基本的にランタイムのフラグを設定して、アセンブリーをロードしてもよいかどうか(つまり、x86のみのアセンブリーがx64プロセスにロードされるのをブロックする)とフラグに基づいてプロセスを開始する方法(新しいEXEの場合)を決定します。ILはどちらのフレーバーでも同じだと思います。
アレクセイレベンコフ

1
@JPRichardsonはい、そうです。しかし、.net 4.5では、サイズを増やすオプションがあります。MSDNを
ペルー

40
@ JPRichardson、32ビットも64ビットもありません。Net実行可能ファイルはプロセスごとに2GBに制限されています-まず、プロセスごとのアドレス空間はOSレベルの制限です(32ビットプロセスの場合は2/3 + GB、64ビットの場合はそれ以上)。実行可能ファイルに "LargeAddressAware"フラグが設定されている場合は、2GB以上を使用してください。私が知っている唯一の2GBの制限は、Int32の範囲(約2GB)によって制限される配列/割り当てサイズに関するものです。
アレクセイレベンコフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.