1

Visual Studio 2008 (MSBuild) で同じソースをコンパイルし、次にコマンド ラインで csc (または NANT) を使用してコンパイルすると、正確に同じバイナリ ファイル (同じアセンブリ) を取得できない理由がわかりません。

コマンド ラインは、出力ウィンドウからコマンドをコピーして vs2008 コマンド プロンプトに貼り付けるため、Visual Studio で呼び出されるものと同じです。

同じソースを別の時点でコンパイルすると、アセンブリ メタデータのタイムスタンプが原因で別のバイナリが取得されることはわかっています。実際、vs2008 によって別の時点で生成された 2 つのバイナリを比較すると、バイナリ データのわずかな違いに気付きます。

しかし、vs でコンパイルしてから csc でコンパイルすると、バイナリは大きく異なります。なぜなのかご存知ですか?どうしたの?

4

4 に答える 4

0

非常に大胆な推測ですが、環境変数はVSIDEと端末で同じではない可能性があります。最悪のシナリオでは、ターミナルバージョンが別の.NETフレームワークに対してリンクしているのでしょうか、それとも少なくとも他のいくつかのライブラリ/コードファイルまたはコンパイラスイッチに対してリンクしているのでしょうか。

于 2009-06-13T17:55:16.943 に答える
0

@ Marc Gravell、Divo、Jon: ILDASM を使用して 2 つのアセンブリを分解してみました。詳細な分析と比較の後、IL の内容はまったく同じであることがわかりましたが、すべてのクラスとメソッド、プロパティの getter と setter などは、アセンブリ内で非常に異なる順序になっています! したがって、2 つのアセンブリを 16 進エディタ/コンパレータと比較すると、まったく異なるバイナリ ボディが表示されます。

ここで、VS と Csc がこのように異なる方法でコンパイラと対話する理由を理解する必要があります!

2 つのアプローチを説明するドキュメントへの参照はありますか?

于 2009-06-14T16:41:25.660 に答える
0

Visual Studio でデバッグ ビルドとバイナリ ビルドのどちらをビルドしているかについては言及していません。コマンドラインのデフォルトがどちらとも同じかどうかはわかりません。

明示的なスイッチ/debug/oスイッチ (必要に応じて設定) を使用してビルドし、Visual Studio でそれらを一致させてみてください。また、Visual Studio ビルド構成で定義されている場合は、DEBUG および/または TRACE シンボルを定義します。

于 2009-06-13T22:42:48.687 に答える