¿Alguien sabe de una manera de comparar dos ensamblados .NET para determinar si se crearon a partir de los "mismos" archivos fuente?Determine si los ensamblados .NET se crearon desde la misma fuente
Soy consciente de que hay algunas utilidades de diferenciación disponibles, como el complemento para Reflector, pero no estoy interesado en ver las diferencias en una GUI, solo quiero una forma automática de comparar una colección de binarios para ver si se construyeron a partir de los mismos (o equivalentes) archivos fuente. Entiendo que múltiples archivos de origen diferentes podrían producir el mismo IL, y me doy cuenta de que el proceso solo sería sensible a las diferencias en el IL, no a la fuente original.
El principal obstáculo para simplemente comparar las secuencias de bytes para los dos ensamblajes es que .NET incluye un campo denominado "MVID" (Module Version Identifier) en el ensamblaje. Esto parece tener un valor diferente para cada compilación, por lo que si construye el mismo código dos veces, el ensamblado será diferente.
Una pregunta relacionada es, ¿alguien sabe cómo forzar que el MVID sea el mismo para cada compilación? Esto evitaría que necesitáramos tener un proceso de comparación que no sea sensible a las diferencias en el valor del MVID. Sería preferible un MVID consistente, ya que esto significa que se podrían usar sumas de verificación estándar.
El trasfondo de esto es que una empresa externa es responsable de revisar y firmar independientemente nuestras publicaciones, antes de que se nos permita lanzar a producción. Esto incluye revisar el código fuente. Quieren confirmar de forma independiente que el código fuente que les proporcionamos coincide con los binarios que construimos, probamos y planeamos implementar. Estamos buscando un proceso que les permita construir el sistema de forma independiente desde la fuente que les proporcionamos, y comparar las sumas de comprobación con las sumas de comprobación de los binarios que hemos probado.
BTW. Tenga en cuenta que estamos usando integración continua, compilaciones automáticas, control de fuente, etc. El problema no está relacionado con una falta de control interno sobre qué archivos de origen se incluyeron en una compilación determinada. El problema es que un tercero es responsable de verificar que la fuente que les proporcionamos produce los mismos binarios que hemos probado y planeamos poner en producción. No deberían confiar en ninguno de nuestros sistemas o controles internos, incluido el servidor de compilación o el sistema de control de código fuente. Lo único que les importa es obtener la fuente asociada con la construcción, realizar la construcción ellos mismos y verificar que los resultados coincidan con lo que decimos que estamos implementando.
La velocidad de ejecución de la solución de comparación no es particularmente importante.
gracias
Si la ÚNICA diferencia es el MVID, seguramente siempre aparecería en la misma posición en el flujo de bytes y su algoritmo de diferencia podría ignorar esas posiciones de bytes. –
Sí, eso es correcto, pero necesitaría saber la estructura del archivo para ignorar este campo. ¿Conoces una referencia sobre el formato? – Clayton
¿Eso es posible? ¿No podría el código fuente diferente (C#, VB.NET, lo que sea) dar como resultado el mismo código binario (o código IL para ese caso)? Puede que no haga una diferencia funcional en ese momento, pero seguiría siendo una diferencia. EDITAR: Vaya, disculpe. Acabo de ver ahora que reconstruyen y luego comparan los binarios. –