概要
Visual Studio 2010で非常に奇妙な動作をしていますが、それがバグなのか、それともこのように動作する理由にねじれたロジックがあるのかはわかりません。
エグゼクティブサマリーでは、[バッチビルド]->[すべて選択]->[再構築]を使用してすべてのプロジェクトのすべての構成をビルドすると、VS2010は、現在選択されているソリューション構成に応じて異なる出力バイナリを生成します。バッチビルド中に選択されたソリューション構成によっては、一部のプロジェクト出力が正しく実行されない(起動時に「[プロジェクト名]が機能しなくなりました」というエラーダイアログが表示される)ため、これは非常に厄介です。
詳細
3つのC#プロジェクトを含むソリューションがあります(1つの.dll出力プロジェクト、他の2つの.exe出力プロジェクトによって参照されます)。.exe出力プロジェクトのうち、プロジェクトAにはプロジェクト構成がRelease
ありDebug
ます。プロジェクトBにはDebug
、、、、Release-x86
およびRelease-x64
構成があります。これは、正しいバージョンのサードパーティライブラリを提供するためにいくつかの異なるビルド後スクリプトを実行する必要があるためです。
4つのソリューション構成があります: Debug
、、、、および。プロジェクトBのみをビルドし、プロジェクトAと共有dllプロジェクトをビルドするように設定されています。Release
Release-x86
Release-x64
Release-x86
-x64
Release
Debug
Debug
[現在の構成]ドロップダウンボックスから[ソリューション構成]を選択し、[すべてバッチビルド]を選択すると、プロジェクトAのリリース構成を実行しようとすると、実行に失敗します。ドロップダウンから他のソリューション構成を選択し、次にすべてをバッチビルドすると、正常に実行されます。生成された.exeファイルを比較すると、これら2つの場合で異なることがわかります。
質問
これはVS2010の既知の意図された動作ですか?もしそうなら、誰かがこの問題が発生している可能性がある理由と私がそれを修正する方法についてのヒントを与えることができますか?これはVS2010のバグですか?
フォローアップの手がかり?[編集]
これは、VS2010が「プロジェクト参照」を処理する方法と関係がありますか?前述したように、両方の.exeプロジェクトはdllプロジェクトを参照し、プロジェクトDと呼びます。[参照の追加]->[プロジェクト]->[プロジェクトD]を選択して、その参照を(たとえば、プロジェクトAに)追加しました。ただし、もちろん、プロジェクトAのさまざまな構成では、さまざまな構成バージョンのプロジェクトDを使用します。プロジェクトAを調べると-> [プロパティ]の下のプロジェクトD参照、編集できない[パス]フィールドが表示されます。選択したソリューション構成に応じて...\Project D\bin\Release\Project D.dll
、``...\Project D\bin\Debug\Project D.dll
、そしてこれを制御する方法が見当たらないので、VS2010はプロジェクト構成の詳細を賢く選択しようとしていると思います。しかし、さらに奇妙なことに、[バッチビルド]->[すべて選択]->[クリーン]を選択してすべてのコンパイル済みファイルを削除すると、これらの参照パスは検査時では...\obj\...
なく...\bin\...
に変更され、削除する以外に元に戻すことはできません。プロジェクト参照を再度追加します。
フォローアップ2[編集2]
私は少し前に嘘をつきました。実際には2つの.dllプロジェクト(たとえば、プロジェクトDとE)があり、Dはプロジェクト参照を通じてEを参照しています。
VS2010のプロジェクト参照で何かが壊れているか奇妙なことが原因であると確信しており、次の手順で、選択されたソリューション構成に依存する動作の根本的な原因を見つけたと思います
1)[バッチビルド]->[すべて]->[クリーン]を選択して、以前にコンパイルされたすべてのバイナリを削除します。
2)ドロップダウンからデバッグソリューション構成を選択します。
3)バッチビルド->プロジェクトAリリースのみを選択->再ビルド。
[出力]ウィンドウを見ると、VS2010はプロジェクトAがDに依存し、DがEに依存していることを認識しているため、逆の順序でそれらを構築しようとしていることがわかります。プロジェクトEのリリース構成を正常にビルドします。しかし、E dllファイルのデバッグバージョンが欠落していると文句を言うため、プロジェクトDのリリース構成をビルドしようとして失敗します。同様に、Dのデバッグバージョンがないため、Aはビルドに失敗します。
したがって、[ソリューション構成]の選択は、プロジェクトからプロジェクトへの参照で参照されているプロジェクトの構成を上書きしているようです。
それは事実であるはずですか?