2009-10-11 7 views
6

Durante un proceso de creación de configuración, tengo la intención de hacer lo siguiente (dentro de un C# Script):cambiar mediante programación la AssemblyVersion y atributos AssemblyFileVersion

  1. Leer los AssemblyVersion y AssemblyFileVersion valores de los atributos de un archivo DLL.
  2. Iterar todas las DLL y ejecutables en el proyecto y aplicar esas versiones a sus valores de atributo AssemblyVersion y AssemblyFileVersion.

Pregunta ahora es: ¿Cómo hacer el paso 2?

Con éxito puedo hacer el paso 1, pero para el paso 2 no veo un verdadero punto de inicio. Lo que probablemente tenga que hacer es usar algunos métodos nativos de P/Invoke ya que los atributos modifican directamente la información de recursos de información de versión de un DLL/ejecutable.

¿Alguna pista sobre esto?

Gracias, Uwe

Respuesta

13

¿Por qué no, durante el proceso de construcción, leyó el AssemblyVersion y AssemblyFileVersion de una DLL, y volver a guardarlo en otra csproject de AssemblyInfo.cs, sólo entonces su compilación?

De hecho, no sé si es posible modificar el archivo DLL directamente, sin recurrir a algo fantasioso.

O, como alternativa, asegúrese de que todas sus DLL comparten un AssemblyInfo.cs común. Puede hacer esto agregando el AssemblyInfo.cs como "Agregar como enlace" cuando agrega un nuevo elemento en csproject. De esta forma, cuando realice una compilación, todos los archivos DLL compartirán el mismo AssemblyInfo.cs y, por lo tanto, generarán el mismo AssemblyVersion.

+1

sí, eso sería mucho ** ** más fácil! Establezca los números de versión directamente en el tiempo de compilación, p. utilizando un servidor de compilación de integración continua –

+1

Esa sería la forma correcta, al cambiar los archivos compilados se rompe la línea de información limpia entre el código y los binarios. –

+0

Muchas gracias, me gusta la idea de compartir el archivo AssemblyInfo.cs! –

1

Si usted tiene acceso a las fuentes, tomar la advice from Graviton

Si no, usted podría estar en problemas. Posiblemente puede desmontar con ILDASM y volver a armar con ILASM. Pero esto no funcionará para las asambleas de nombre fuerte.

2

En mi caso, creé una plantilla T4 para cambiar AssemblyVersion y AssemblyFileVersion. Llamé a la plantilla Assembly.tt y la convertí en un archivo vinculado (cuando lo agregue, elija Agregar enlace, en lugar de Agregar). Todas mis asambleas extraen el archivo Assembly.tt vinculado.

Puede ejecutar la plantilla T4 desde una ubicación y actualizará todas las versiones de AssemblyVersion y AssemblyFileVersions. No es necesario que llame al archivo AssemblyInfo.cs para obtener la información en sus dlls.

El código para el archivo Assembly.tt es:

<#@ template language="C#" hostspecific="true" #> 
// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
<#+ 
    int RevisionYear = DateTime.UtcNow.Year; 
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays; 
    int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes; 
#> 

La salida de la plantilla T4 anterior será:

// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.2016.284.1066")] 
[assembly: AssemblyFileVersion("4.2016.284.1066")] 
Cuestiones relacionadas