6

Evey はときどき、.NET アセンブリの x86 バージョンと x64 バージョンの両方を目にします。SharePoint の次の Web パーツを検討してください。開発者が 1 つのバージョンだけを提供し、JIT コンパイラーに残りを整理させないのはなぜでしょうか? これらの種類の提供物を見たとき、開発者がJIT を避けるためにngenのようなツールを使用してネイティブ イメージを作成することを決定しただけですか?

誰かここで私を助けてください。

更新しました

以下の内容から、x86 ビルドと x64 ビルドの両方が提供されているのは、次の理由の 1 つ以上のためです。

  1. 開発者は JIT を回避したいと考え、ngen.exe などのツールを使用して特定のアーキテクチャをターゲットにして、コードのネイティブ イメージを作成しました。

  2. アセンブリにはプラットフォーム固有の COM 呼び出しが含まれているため、AnyCPU としてビルドしても意味がありません。このような場合、異なるプラットフォームを対象とするビルドには、異なるコードが含まれている可能性があります。

  3. アセンブリには、JIT によって再マップされない pinvoke を使用する Win32 呼び出しが含まれている可能性があるため、ビルドはバインドされているプラ​​ットフォームをターゲットにする必要があります。

4

3 に答える 3

6

特定の非 .Net API を使用している場合、これには 2 つのコード ベースが存在する可能性があります。完全な例は COM コントロールです。

あなたが言及したように、ngenもこれのもう1つの非常に正当な理由です。

于 2009-01-17T23:38:30.167 に答える
6

.net アプリケーションをコンパイルするときは、ビルド設定でプラットフォーム ターゲットを選択する必要があります。選択肢は、AnyCPU、x86、および x64 です。

一般的なバグは、x86 用にコンパイルされたネイティブ DLL を含むプロジェクトで AnyCPU を指定することです。これにより、64 ビット マシンで実行するとエラーが発生するため、64 ビット マシンでテストすることをお勧めします。

したがって、他の依存関係によって x86 または x64 用に直接ビルドすることを余儀なくされている人々をサポートするために、アセンブリは両方を提供します。

于 2009-01-18T02:40:50.940 に答える
0

COM は、32/64 ビット境界を越えてマーシャリングとアンマーシャリングを処理します。ただし、別のタイプのバイナリをアパートメントの間違ったポインタ幅にロードすることはサポートされていません。

多くのアセンブリはネイティブ コードに依存しています (たとえば、ほとんどの SQL ドライバーは C または C++ で記述されています)。これは、p/invoke を使用するすべてのもので非常に明白です。したがって、異なるポインター幅をコンパイルして配布するということは、64 ビット バージョンのパッケージには 64 ビット ネイティブ DLL が含まれている可能性が高く、32 ビット バージョンには 32 ビット ネイティブ DLL が含まれている可能性が高いことを意味します。これは、アセンブリの 32 ビット バージョンと 64 ビット バージョンが同じコードからコンパイルされている場合でも当てはまります。

csc は、必要に応じてネイティブ (JIT 処理前) のイメージを生成します。

于 2013-09-03T02:27:28.750 に答える