3

簡単な背景: Vista-x64 マシンの .net 3.5 で VS2008 で C# を開発しています。

私は最近 Vista-x64 に切り替えましたが、いくつか検索した後でも、OS と .net フレームワークの間の相互作用を完全には理解していないように感じます。これに関する訂正/説明をお願いします。

以下は、開発プロセスに関する私の理解です(間違っている場合は修正してください)。

プロジェクトをセットアップするときに、プラットフォーム ターゲット (x64、x86、AnyCpu) を設定できます。私が理解しているように、AnyCpu は現在のプラットフォーム (私の場合は x64) をターゲットにします。x86 をターゲットにして実行することもできます (WoW64 のため)。

x64 を対象とする場合、プログラムは 64 ビットの .net フレームワーク 3.5 を使用し、x86 では同様に 32 ビット フレームワークを使用すると想定しています。これは正しいです?

私を混乱させるのは、x64 をターゲットにしてプラットフォーム情報を出力すると、「WIN32NT」と出力されることです。これにより、「WIN32NT」は私が思っているものではないと思いますが、これについてはあまり知ることができませんでした。これは何ですか?

ComputerInfo computerInfo = new ComputerInfo();
Console.WriteLine("{0,-30}:\t{1}", "Platform", computerInfo.OSPlatform);

ありがとう。

4

4 に答える 4

4

通常、AnyCPU をターゲットにする必要があります。AnyCPU は、ターゲット システムの「ネイティブ」モードで実行されます。アプリケーションを 32 ビット マシンで起動すると 32 ビットで実行され、64 ビット システムで起動すると 64 ビットで実行されます。

他の設定のいずれかを使用する唯一の理由は、32 ビットまたは 64 ビットで実行する必要があるためです。これは、特定の要件を持つライブラリを使用する場合に発生します。たとえば、このSQLITEライブラリにはアンマネージ コードが含まれています。AnyCPU にコンパイルされたアプリケーションで使用すると、そのアプリケーションは 32 ビット システムでは正常に動作しましたが、64 ビット システムではライブラリをロードできませんでした。その理由は、Sqlite ライブラリのアンマネージ コードが 32 ビットにコンパイルされるためです。.net でも、32 ビットと 64 ビットのアセンブリを混在させることはできません。

その場合の正しい解決策は、明示的に x86 にコンパイルすることでした (これは、64 ビットで実行しても得られない小さなツールです)。そのため、私のアプリケーションは 64 ビット Windows でも 32 ビット アプリケーションとして実行されます。

もう 1 つの可能性は、アプリケーションを AnyCPU にコンパイルしたままにし、異なるプラットフォームを明示的に処理することです。たとえば、正しいアンマネージ アセンブリを遅延ロードすることによってです。

アンマネージ コードでのこのような影響以外では、アプリケーションがどのフレームワーク用にコンパイルされているかはほとんど関係ないと思います。極端な反例しか思い浮かびません。おそらく、非常に大量の RAM を必要とするアプリケーションを x64 にコンパイルする必要があるかもしれません。しかし、典型的な平凡な .net アプリケーションは、どのプロセッサとどのモードで実行されるかを気にしません。ただし、知りたい場合は、他の回答で提案されているように、いつでも IntPtr のサイズを確認できます。

于 2009-10-16T21:49:14.460 に答える