3

ProjectA (exe)ProjectB (exe)ProjectD (クラス ライブラリ)の 3 つのプロジェクトがあります。

プロジェクト A は System.Data.OracleClient.dll と ProjectD を参照します。プロジェクト B は ProjectD を参照するだけです。Oracle の 32 ビット クライアント バージョンがインストールされているため、ProjectA は 32 ビット アプリケーションである必要があります。プロジェクト B は、64 ビット アプリケーションとしてビルドできます。

プロジェクト A のビルド設定:

プラットフォーム: アクティブ (x86)

プラットフォーム ターゲット: x86

プロジェクト B のビルド設定:

プラットフォーム: アクティブ (任意の CPU)

プラットフォーム ターゲット: 任意の CPU

私の質問は、ProjectD (クラス ライブラリ) のビルド設定はどうあるべきですか? ProjectA と ProjectB がビルドされると、ProjectD は異なる方法でビルドされますか? CLR のより深い説明は、プロジェクトのコミュニケーションの観点から素晴らしいでしょう。

ProjectA と ProjectB は 64 ビット Windows Server 2008 で使用されます。インストールは不要で、スタンドアロンの exe のみです。

4

2 に答える 2

6

EXE プロジェクトのプラットフォーム ターゲット設定のみが重要です。これは、最初に読み込まれ、プロセス全体のビット数を決定するアセンブリです。

DLL には選択肢がありません。EXE プロジェクトによって選択されたものと互換性がなければなりません。したがって、DLL プロジェクトに AnyCPU を選択することは、ほとんどの場合正しい選択です。

明示的な設定を使用するケースはごくわずかです。クラス ライブラリが Oracle プロバイダなどのネイティブ コードに依存しており、そのネイティブ コードを間違ったビット数で実行しようとすると、完全に不可解な例外が発生することがわかっている場合にのみ、そうする必要があります。DLL のプラットフォーム ターゲットを選択することで、その例外を回避し、(わずかに) より良い例外を取得できます。プログラムは、アセンブリを読み込もうとすると、早い段階で BadImageFormatException で失敗します。ただし、この例外は非常に有益なものではありません。管理者が実際の問題が別の場所にあると判断する前に、DLL を数回再インストールしようとする可能性があります。

したがって、基本的な基本ルール: EXE プロジェクトには x86 を選択し、他のすべてのクラス ライブラリ プロジェクトには AnyCPU を選択します。

于 2013-03-19T12:57:11.760 に答える
2

私の質問は、ProjectD (クラス ライブラリ) のビルド設定はどうあるべきですか? ProjectA と ProjectB がビルドされると、ProjectD は異なる方法でビルドされますか? CLR のより深い説明は、プロジェクトのコミュニケーションの観点から素晴らしいでしょう。

ライブラリに使用するだけAny CPUです。32 ビット環境と 64 ビット環境の両方で実行できる独自のアセンブリを構築します。

技術的には、実行時に 32 ビット コードまたは 64 ビット コードを生成するジャスト イン タイム コンパイルです。

于 2013-03-19T12:39:43.080 に答える