12

Visual Studio でプロジェクトをリリース モードでビルドするのに問題がありました...アセンブリの形式が間違っているというエラーが表示されます。x64 アセンブリではなく、一部の x86 アセンブリが参照されていたことが判明しました。PresentationCore、System.Data などのアセンブリ。

私が試したこと:

  • デバッグ モード、どの CPU ビルドでも問題ありません。

  • デバッグ モード、x64 ビルドは問題ありません。

  • リリース モード、いずれかの CPU に障害が発生

  • リリース モード、x64 が失敗する (これは、プロジェクトをビルドしたい組み合わせです)

この問題は、x86 参照を削除して x64 参照に切り替えようとすると発生します。Visual Studio は、x64 参照の代わりに古い x86 参照を追加するだけです。例えば:

にある System.Data 参照を削除しますC:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

を参照して追加しC:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dllますが、その System.Data 参照をクリックすると、パスは明らかに古い dll のままであり、同じエラーが発生します。これは、他のいくつかの DLL でも発生しています。

この問題の解決策を知っている人はいますか?

4

5 に答える 5

18

PresentationCore、System.Data などのアセンブリ。

エラー メッセージを表示せずに質問に答えるのは嫌いです。しかし、この二次的な証拠は、質問に答えるのに十分です. まず、これはエラーではなく警告です。次のようになります。

警告 CS1607: アセンブリの生成 -- 参照されたアセンブリ 'System.Data.dll' は別のプロセッサをターゲットにしています

また、mscorlib.dll の 1 つも表示されます。および WPF プロジェクトの PresentationCore.dll。ここで何が起こっているかというと、これらのアセンブリは特別であり、混合モードのアセンブリです。つまり、ネイティブ コードとマネージ コードの両方が含まれています。ネイティブ コードはトラブルメーカーです。このようなアセンブリは、適切なプロセッサ フレーバーを対象とするプロジェクトでのみ使用できます。混同すると、実行時に BadImageFormatException が発生します。

これは .NET アセンブリの実際の問題ではありません。マシンには、実際にはこれらの DLL の2 つのバージョンが GAC に格納されています。1 つはプログラムが 32 ビット モードで実行される場合に使用され、もう 1 つは 64 ビット モードで使用されます。CLR は自動的に正しいものを選択します。

ただし、参照アセンブリのバージョンは 1 つだけです。これはc:\windows\microsoft.net に格納され、メタデータを読み取るためにコンパイラに渡すものです。それは常に x86 バージョンです。他にはないので、探す必要はありません。繰り返しますが、これは問題ではありません。参照アセンブリのメタデータのみがコンパイラによって使用され、そのコードは実行されません。また、メタデータはアセンブリのビット数に依存しません。

それでも、独自の混合モード アセンブリを作成する場合、これはすべて問題になる可能性があります。2 つのバージョンを提供する必要性を簡単に見落とす可能性があります。したがって、コンパイラが心配しているのは、プロジェクトの AnyCPU または x64 ビルドを要求したことです。ただし、x86 を対象とする場合にのみ参照アセンブリが機能することを検出します。少しきしみますが、あなたが間違っているという証拠がいくつかあり、プログラムを実行すると BadImageFormatException が発生する可能性があることを穏やかに思い出させてください。それ以外の場合は、フレームワーク参照アセンブリを独自の参照アセンブリと異なるものとして扱いません。

したがって、機能であり、バグではありません。それ以外の場合は、プログラムのビルドを妨げない単なる警告です。.NET には実行時に GAC で使用可能な適切なアセンブリがあることがわかっているため、この警告は無視しても問題ありません。注目すべきは、.NET 4.0 にはこの問題がなく、ILONLY メタデータ フラグがオフになっていない非常に異なる参照アセンブリを使用していることです。

于 2012-12-07T19:04:14.603 に答える
6

奇妙な振る舞い。プロジェクト プロパティの [ビルド] で [シリアル化アセンブリの生成] をオフにすると、プロジェクトはリリース モードで正常にビルドされます。このリンクを見ると、この設定が XML シリアライゼーションに関係していることがわかります。これは、ソリューション全体では使用していません。

とても奇妙です。ここで、この質問と動作の説明をまだ探しています。

于 2012-11-28T21:58:13.020 に答える
2

ビルド構成がどのように見えるかを確認してください。ソリューション上の特定のプロジェクトが、別のビルド構成ではなく、あるビルド構成でビルドされるように構成されているために、このエラーが発生することがあります。

これをする:

  1. 「コンパイル>構成管理...」に移動します。
  2. 「アクティブソリューション構成」で、問題が発生している構成である「リリース」を選択します。
  3. 「アクティブなソリューションのプラットフォーム」で、「任意のCPU」をチェックします。「x64」が定義されている場合は、それも選択できる可能性があります。
  4. ビルドプロジェクトのリストを見てください。ソリューションに必要なすべてのプロジェクトは、「構成」、「プラットフォーム」で正しい値でマークされ、「コンパイル」チェックが必要です。

私の場合、少なくともデバッグモードでは、コンパイルに時間がかかるため、ほとんどの場合チェックを外すサンドキャッスルプロジェクトがあります。1つのプロジェクトに「リリース」構成の構成がない場合があります。そのため、ビルドプロセスが結果を取得しようとすると、これらは存在せず(DLLがない)、例外がスローされます。他の状況では、プロジェクトがx86(またはx64)用に強制的にコンパイルされ、残りはコンパイルされない場合があります。そのため、他の参照プロジェクトを参照されたDLLの適切なバージョンにリンクしようとするとエラーがスローされます。

于 2012-12-10T12:35:10.273 に答える
1

どのバージョンの .NET 用にコンパイルしていますか? プロジェクトを新しいバージョンの .NET Framework に変更できる場合は、それが役立つ場合があります。

于 2012-12-06T20:03:02.787 に答える