visual studio instalador generar ejecutable crear compilar como clean c# .net visual-studio build-process

instalador - generar ejecutable visual studio 2017 c#



¿Por qué se produce una dll diferente después de una compilación limpia, sin cambios de código? (5)

Cuando hago una construcción limpia de mi proyecto C #, el dll producido es diferente al construido previamente (que guardé por separado). No se hicieron cambios en el código, solo limpiar y reconstruir.

Diff muestra algunos bytes en el DLL que tienen cambios, algunos cerca del comienzo y pocos cerca del final, pero no puedo entender qué representan. ¿Alguien tiene ideas sobre por qué está sucediendo esto y cómo prevenirlo?

Esto es usando Visual Studio 2005 / WinForms.

Actualización: no se usa el incremento automático de la versión ni se firma el ensamblaje. Si se trata de una marca de tiempo de algún tipo, ¿cómo puedo evitar que VS lo escriba?

Actualización: después de buscar en Ildasm / diff, parece que los siguientes elementos son diferentes:

  • Dos bytes en el encabezado PE al inicio del archivo.
  • <Detalles de PrivateImplementation> sección { guid }
  • Parte críptica de la tabla de cuerdas cerca del final (me pregunto por qué, no cambié las cuerdas)
  • Partes de la información de ensamblaje al final del archivo.

No tengo idea de cómo eliminar ninguno de estos, si es posible ...


¿Aumenta automáticamente los números de versión (compilación o revisión)? Eso causaría que una pequeña porción del contenido de la dll cambie cada vez que se vuelva a compilar.


Apuesto a que es una marca de tiempo.


Creo que ese sería el campo TimeDateStamp en el encabezado IMAGE_FILE_HEADER de las especificaciones PE32 .


Mi mejor estimación sería que los bytes modificados que está viendo son las columnas de metadatos utilizadas internamente que se generan automáticamente en tiempo de compilación.

Algunas de las columnas Ecma-335 Partition II (definición de metadata de especificación CLI) que pueden cambiar por compilación, incluso si el código fuente no cambia en absoluto:

  • Module.Mvid: Un GUID generado en tiempo de creación. Siempre cambia, cada construcción.
  • AssemblyRef.HashValue: podría cambiar si está haciendo referencia a otro ensamblado que también se ha reconstruido desde la compilación anterior.

Si esto realmente te molesta, mi mejor consejo para descubrir exactamente qué está cambiando sería diferir las tablas de metadatos reales. La forma de obtenerlos es usar la ventana ildasm de MetaInfo:

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


Podría ser que los números de compilación o revisión hayan cambiado.