コードを変更せずにクリーン ビルドを行った後に別の DLL が生成されるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/107196

質問

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

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

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

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

アップデート: Ildasm/diff を確認したところ、以下の項目が異なるようです。

  • ファイルの先頭の PE ヘッダーの 2 バイト。
  • <PrivateImplementationDetails>{ガイド} セクション
  • 文字列テーブルの終わり近くの不可解な部分 (文字列を変更していないのはなぜでしょう)
  • ファイルの最後にあるアセンブリ情報の一部。

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

役に立ちましたか?

解決

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

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

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

これが本当に気になる場合は、何が変更されているかを正確に見つけるための最善のヒントは、実際のメタデータ テーブルの差分を確認することです。これらを取得するには、ildasm MetaInfo ウィンドウを使用します。

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

View > MetaInfo > Show!

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top