Pregunta

Durante un proceso de creación de configuración, tengo la intención de hacer lo siguiente (dentro de un C # script ):

  1. Leer los valores de los atributos AssemblyVersion y AssemblyFileVersion de una DLL.
  2. Iterar todos los archivos DLL y ejecutables en el proyecto y aplicar los versión a sus valores y atributos AssemblyVersion AssemblyFileVersion.

pregunta ahora es:? Cómo hacer el paso 2

Yo puedo hacer con éxito el paso 1, pero para el paso 2 no veo un punto de inicio real. Lo que probablemente tenga que hacer es utilizar algún nativo P / Invoke métodos ya que los atributos modificar directamente la información de la versión fuente de información de un archivo DLL / ejecutable.

¿Alguna pista sobre esto?

¿Fue útil?

Solución

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

Como cuestión de hecho, no sé si es posible modificar el archivo DLL de forma directa, sin tener que recurrir a algo extravagante.

O, alternativamente, asegurarse de que todos sus archivos DLL comparten una AssemblyInfo.cs común. Usted puede hacer esto mediante la adición de la AssemblyInfo.cs como "añadir como Enlace" cuando se agrega un nuevo elemento en csproject. De esta manera, cuando se hace una recopilación, todas las DLL compartirán la misma AssemblyInfo.cs, y por lo tanto la salida de la misma AssemblyVersion.

Otros consejos

En mi caso, he creado una plantilla T4 para cambiar el AssemblyVersion y AssemblyFileVersion. Llamé a la plantilla Assembly.tt, y lo hizo en un archivo vinculado (cuando se agrega elegir Añadir enlace, en lugar de Agregar). Todos mis montajes tiran en el archivo Assembly.tt vinculado.

A continuación, puede ejecutar la plantilla T4 de un lugar y va a actualizar toda la AssemblyVersion y AssemblyFileVersions. Usted no tiene que llamar a los AssemblyInfo.cs de archivo para la información que se detuvo 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 anteriormente 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 usted tiene acceso a las fuentes, tomar el consejo href="https://stackoverflow.com/questions/1550249/programmatically-change-the-assemblyversion-and-assemblyfileversion-attributes/1550251#1550251">

Si no lo hace, usted podría estar en problemas. Posiblemente se puede desmontar y volver a montar con ILDASM con ILASM. Pero esto no va a funcionar para los ensamblados con nombre.

scroll top