c# - Cambie mediante programación los atributos AssemblyVersion y AssemblyFileVersion
.net attributes (3)
¿Por qué no, durante el proceso de compilación, lee AssemblyVersion
y AssemblyFileVersion
de una DLL y la guarda de nuevo en AssemblyInfo.cs de csproject, y luego la compila?
Como cuestión de hecho, no sé si es posible modificar el archivo DLL directamente, sin recurrir a algo imaginativo.
O, como alternativa, asegúrese de que todas sus DLL comparten un AssemblyInfo.cs
común. Puede hacer esto agregando AssemblyInfo.cs
como "Agregar como enlace" cuando agrega un nuevo elemento en csproject. De esta forma, cuando realice una compilación, todas las DLL compartirán el mismo AssemblyInfo.cs
y, por lo tanto, generarán la misma AssemblyVersion
.
Durante un proceso de creación de configuración, estoy planeando hacer lo siguiente (dentro de una secuencia de comandos C # ):
- Lea los valores de los atributos
AssemblyVersion
yAssemblyFileVersion
de una DLL. - Iterar todas las DLL y ejecutables en el proyecto y aplicar esas versiones a sus valores de atributo
AssemblyVersion
yAssemblyFileVersion
.
La pregunta ahora es: ¿Cómo hacer el paso 2?
Con éxito puedo hacer el paso 1, pero para el paso 2 no veo un punto de inicio real. 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
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.
Luego puede ejecutar la plantilla T4 desde una ubicación y actualizará todas las versiones 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;
#>
El resultado de la plantilla T4 arriba 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")]
Si tiene acceso a las fuentes, siga los consejos de Graviton
Si no lo haces, podrías tener problemas. Posiblemente puede desmontar con ILDASM y volver a armar con ILASM. Pero esto no funcionará para las asambleas de nombre fuerte.