7

VS2005で単純な「HelloWorld」アプリケーションを作成しました。これは単純なコンソールアプリケーションです。次の行のみが含まれています。

Console.WriteLine("Hello World");
Console.ReadLine();

変更を加えずに(再構築ボタンを押すだけで)同じコンソールアプリケーションを再構築しようとすると、微妙に異なる実行可能ファイルが表示されます。(1番目と2番目に生成された実行可能ファイルの両方からSHA-1ハッシュを生成しましたが、それは異なります!)

コード変更がないのになぜ違うのですか?実際に何が変わったのですか?比較するために16進エディターを使用しましたが、2、3の異なるバイトしか表示されませんでした。

私の最終的な質問は、「アセンブリ」が本当に変更されたかどうかをどうやって知ることができるかということだと思います。(もちろん、ファイルのバージョンやファイルのサイズなどは確認しません)

編集

これまでのところ、違いはPEヘッダー(タイムスタンプと一部のデバッグデータ)にあることを確認しました。ホイールを再発明する前に、PEヘッダーを無視する「アセンブリ比較」ツールはありますか?

ありがとう、イアン

4

3 に答える 3

6

違いは

  • PEヘッダーのタイムスタンプ
  • デバッグデータのGUID(存在する場合)

(そして、あなたが投稿した他の出力のように、おそらくもっと何か?)これらを確認するdumpbin /all /rawdata:noneには、VSコマンドプロンプトで両方のアセンブリを実行します。

これを適切に行うには、これを理解してそれらのバイトを無視する比較ツールを作成する必要があります。または、実行可能ファイルのコピーを取り、タイムスタンプとGUIDをクリアしてから、これらのバージョンを比較します。または、ピンチで、fc /bcontrolfreakが示唆するようなものを使用して、20バイト未満の違い(タイムスタンプが4、GUIDが16)であれば、おそらく同じであると想定できます。

タイムスタンプをクリアしたアセンブリを使用するのはうまくいくかもしれません-AFAIKは、エクスポートされたシンボルオフセットを他のDLLにキャッシュするためにのみ使用されますが、それをフックした場合は、そのままにしておく方がおそらく安全です。実際にバイナリ同一のアセンブリが必要な場合は、プロセスを変更して、本当に必要でない限りクリーンビルドしないようにすることをお勧めします。

于 2010-07-23T08:36:17.613 に答える
2

Visual Studio のコマンド プロンプトから、より詳細な比較を行うことができます。

  • 次の出力を使用して PE ヘッダーを比較できますdumpbin

    dumpbin /HEADERS assembly.dll
    
  • または、以下を使用して、アセンブリに埋め込まれた PE ヘッダーと IL コードを比較できますildasm

    ildasm /ALL /TEXT assembly1.dll > dump1.txt
    ildasm /ALL /TEXT assembly2.dll > dump2.txt
    fc dump1.txt dump2.txt        
    

    この/ALLオプションは、DOS および PE ヘッダー、CLR ヘッダー、アセンブリ メタデータ、逆アセンブルされた IL をダンプします。ただし、埋め込みリソースは含まれません。アセンブリに埋め込みリソースが含まれている場合は、/OUTオプションを使用できます。これにより、埋め込みリソースごとに個別のファイルが作成され、WinMerge などのお気に入りの差分ツールを使用して比較できます。

    ildasm /ALL /TEXT /OUT:folder1\dump.txt folder1\assembly.dll
    ildasm /ALL /TEXT /OUT:folder2\dump.txt folder2\assembly.dll
    
于 2010-07-23T08:46:12.040 に答える
0

コマンド ラインで fc /b < 古いファイル > < 新しいファイル >

于 2010-07-23T08:28:16.880 に答える