16

C# プロジェクトをクリーン ビルドすると、生成された dll が、以前にビルドしたもの (個別に保存したもの) とは異なります。コードの変更は行われず、クリーンアップして再構築するだけです。

Diff は、DLL 内の一部のバイトに変更があることを示しています。最初の部分と最後の部分にいくつかありますが、これらが何を表しているのかわかりません。なぜこれが起こっているのか、それを防ぐ方法について洞察を持っている人はいますか?

これは、Visual Studio 2005 / WinForms を使用しています。

更新:自動バージョンインクリメントを使用しないか、アセンブリに署名します。それがある種のタイムスタンプである場合、VSがそれを書き込まないようにするにはどうすればよいですか?

更新: Ildasm/diff を調べたところ、次の項目が異なるようです。

  • ファイルの先頭にある PE ヘッダーの 2 バイト。
  • <PrivateImplementationDetails>{ guid } セクション
  • 末尾付近の文字列テーブルの不可解な部分 (なぜ文字列を変更しなかったのか不思議です)
  • ファイルの末尾にあるアセンブリ情報の一部。

可能であれば、これらのいずれかを排除する方法がわかりません...

4

3 に答える 3

14

私の推測では、表示されている変更されたバイトは、ビルド時に自動的に生成される内部で使用されるメタデータ列です。

ソースコードがまったく変更されていない場合でも、ビルドごとに変更できるEcma-335パーティションII(CLI仕様メタデータ定義)列の一部:

  • Module.Mvid:ビルド時に生成されたGUID。ビルドごとに常に変更されます。
  • AssemblyRef.HashValue:古いビルド以降に再ビルドされた別のアセンブリを参照している場合は変更される可能性があります。

これが本当に本当に気になる場合は、何が変更されているかを正確に把握するための最善のヒントは、実際のメタデータテーブルを比較することです。これらを取得する方法は、ildasmMetaInfoウィンドウを使用することです。

View > MetaInfo > Raw:Header,Schema,Rows // important, otherwise you get very basic info from the next step

View > MetaInfo > Show!
于 2008-09-20T06:52:17.913 に答える
10

これは、 PE32仕様のIMAGE_FILE_HEADERヘッダーのTimeDateStampフィールドになると思います。

于 2008-09-20T06:48:13.977 に答える
-1

ビルド番号またはリビジョン番号が変更された可能性があります。

于 2008-09-20T05:12:30.243 に答える