2009-08-26 16 views
11

Ogni volta che ricompiliamo la nostra applicazione C# ci ritroviamo con EXE con diverse firme MD5. Stiamo ricompilando sulla stessa macchina, a pochi minuti di distanza. Perché lo stesso codice sorgente non produce lo stesso risultato? C'è un modo per risolvere questo problema?Perché C# genera EXE diversi per lo stesso codice sorgente?

+0

Immagino che tu abbia già ma ... hai controllato il manifest con IL DASM? – yeyeyerman

risposta

17

"Così, ogni assemblea ha:

  1. un timestamp, in due luoghi
  2. un GUID che hanno abbinato il PPB
  3. Quello che sembra essere un GUID del tutto casuale generato ogni compilazione
  4. A. contatore che indica quale sia la build dell'assembly - generata solo nelle successive build di Visual Studio. "

da:

http://ritter.vg/#code_adventures_clr1

+0

Buona risposta. Grazie! – Gili

2

Ho dovuto suddividere questi casi in precedenza e sembra essere solo modifiche al tipo di timbro DateTime (è un'ipotesi). Se si inseriscono entrambi gli assembly con gli strumenti diff, si vedrà solo un numero molto piccolo di righe nel PE modificato; se cambi anche una piccola quantità di codice e confronti gli assemblaggi vedrai differenze drasticamente più grandi.

Ecco una domanda ho aperto mentre la ricerca di strumenti per identificare le differenze "reali" da quelli superficiali:

.NET Assembly Diff/Compare Tool - What’s available?

0

Ci sarà una costruito nel numero di versione che cambierà ad ogni generazione.

+2

Anche se la versione dell'assembly è impostata staticamente su qualcosa come "1.0.0.0"? L'unica volta che una versione di build dovrebbe cambiare è se è stata definita come "1.0.0. *" O modificata manualmente, no? – STW

+0

La versione dell'assieme è già impostata su un valore statico. – Gili

4

Penso che la chiave potrebbe essere "minuti a parte". Se è presente un timestamp all'interno dell'EXE, ciò modificherà la firma MD5.

+0

È una supposizione? – Gili

+0

Non ho mai esaminato l'EXE prodotto dal compilatore C# e non ho toccato C# in più di un anno. Ma spiegherebbe tutto molto bene, e ha senso. –

2

Molto probabilmente si hanno diversi * nel numero di versione dell'assieme. Ciò fa sì che il numero di versione dell'assembly venga incrementato automaticamente sulla build, il che causerà una differenza visibile nell'assieme prodotto. Quindi un diverso checksum MD5.

Provare a cambiare il numero di versione in una versione di assemblaggio costante e vedere se questo risolve il problema.

2

Si potrebbe provare a eseguire ildasm.exe (il mio percorso per questo è C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin) sui due file .exe.

Quindi scaricare la vista grezza delle intestazioni e confrontarle con uno strumento diff. Se non c'è ancora alcuna differenza, allora potrebbero essere le intestazioni PE che avrebbero bisogno di uno strumento più avanzato da scoprire. Ildasm ti dà la dimensione dell'intestazione PE e altre statistiche su di esso però.

+0

Consiglio vivamente l'uso dei flag/source e/out. –

Problemi correlati