¿Cuáles son las diferencias entre AssemblyVersion, AssemblyFileVersion y AssemblyInformationalVersion?

StackOverflow https://stackoverflow.com/questions/64602

  •  09-06-2019
  •  | 
  •  

Pregunta

Hay tres conjunto de atributos de versión.¿Cuáles son las diferencias?Está bien si puedo usar AssemblyVersion e ignorar el resto?


MSDN dice:

  • AssemblyVersion:

    Especifica la versión de la asamblea que se atribuyen.

  • AssemblyFileVersion:

    Indica al compilador que utilice un determinado número de versión para el Win32 versión del archivo de recursos.El Win32 versión del archivo no es necesario que sea el mismo que el de la asamblea del número de versión.

  • AssemblyInformationalVersion:

    Define adicional de la información de versión de un manifiesto de ensamblado.


Este es un seguimiento a ¿Cuáles son las mejores prácticas para el uso de los Atributos de Ensamblado?

¿Fue útil?

Solución

AssemblyVersion

Donde otras asambleas que hacen referencia a su asamblea mirada.Si este número de cambios, en otras asambleas tener que actualizar sus referencias a la asamblea!El AssemblyVersion es necesario.

Yo uso el formato: las principales.menor de edad.Esto daría como resultado:

[assembly: AssemblyVersion("1.0")]

AssemblyFileVersion

Utilizado para la implementación.Puede aumentar este número para cada implementación.Es utilizado por los programas de instalación.Se usa para marcar las asambleas que tienen el mismo AssemblyVersion, pero son generados a partir de diferentes generaciones.

En Windows, se puede ver en las propiedades del archivo.

Si es posible, que sea generada por MSBuild.El AssemblyFileVersion es opcional.Si no se da, la AssemblyVersion se utiliza.

Yo uso el formato: las principales.menor de edad.de la revisión.construir, donde puedo utilizar la revisión de la etapa de desarrollo (Alfa, Beta, RC y RTM), service packs y revisiones.Esto daría como resultado:

[assembly: AssemblyFileVersion("1.0.3100.1242")]

AssemblyInformationalVersion

La versión del Producto de la asamblea.Esta es la versión que utiliza al hablar con los clientes o para mostrar en su sitio web.Esta versión puede ser una cadena, como '1.0 Release Candidate'.

El Análisis de Código se quejan de que (CA2243) -- se informa a Microsoft (no se fija en VS2013).

El AssemblyInformationalVersion es opcional.Si no se da, el AssemblyFileVersion se utiliza.

Yo uso el formato: las principales.menor de edad [revisión como string].Esto daría como resultado:

[assembly: AssemblyInformationalVersion("1.0 RC1")]

Otros consejos

El control de versiones de los ensamblados de .NET puede ser confuso perspectiva dado que actualmente hay al menos tres formas de especificar una versión para su montaje.

Aquí están las tres principales relacionados con la versión de la asamblea atributos:

// Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

Por convención, las cuatro partes de la versión se conoce como el Versión Principal, Versión Menor, Construir, y Revisión.

El AssemblyFileVersion está diseñada para identificar una compilación de la individuo de la asamblea

Normalmente, usted va a configurar manualmente los Principales y secundarias AssemblyFileVersion para reflejar la versión de la asamblea, a continuación, incrementar la generación y/o Revisión cada vez que su sistema de construcción compila el ensamblado.El AssemblyFileVersion debería permitir identificar de forma única una compilación de la asamblea, de modo que usted puede utilizarlo como un punto de partida para la depuración de problemas.

En mi proyecto actual que tenemos el servidor de generación de codificar el changelist número de nuestro repositorio de control de origen, en la construcción y Revisión de las partes de la AssemblyFileVersion.Esto nos permite asignar directamente desde un ensamblaje a su código fuente, para cualquier asamblea generado por el servidor de compilación (sin tener que usar etiquetas o sucursales en el control de código fuente, o manualmente mantener los registros de las versiones publicadas).

Esta versión número está almacenado en la versión Win32 recursos y puede verse al observar el Explorador de Windows páginas de propiedades para la asamblea.

El CLR no se preocupa ni examinar la AssemblyFileVersion.

El AssemblyInformationalVersion es la intención de representar a la versión completa de su producto

El AssemblyInformationalVersion está diseñado para permitir coherente de control de versiones de todo el producto, que puede consistir en muchas de las asambleas que son, independientemente de versiones, tal vez con diferentes versiones de políticas, y, potencialmente, desarrollado por los equipos dispares.

"Por ejemplo, la versión 2.0 de un producto puede contener varias asambleas;uno de estas asambleas es marcado como la versión 1.0 ya que es una nueva asamblea no incluidos en la versión 1.0 de la mismo producto.Normalmente, se establece la mayor y menor de partes de esta versión número para representar la versión pública de su producto.A continuación, puede incrementar la compilación y revisión de partes cada vez empaquetar un producto completo con todos sus asambleas." — Jeffrey Richter, [CLR a través de C# (Segunda Edición)] p.57

El CLR no se preocupa ni examinar la AssemblyInformationalVersion.

El AssemblyVersion es la única versión del CLR se preocupa por (pero que se preocupa por todo AssemblyVersion)

La AssemblyVersion es utilizado por el CLR para enlazar a ensamblados con nombre seguro.Se almacena en el AssemblyDef manifiesto de la tabla de metadatos de la asamblea, y en la AssemblyRef tabla de una asamblea a la que hace referencia.

Esto es muy importante, porque significa que cuando se hace referencia a un ensamblado de nombre, está estrechamente vinculado a un determinado AssemblyVersion de la asamblea.Toda la AssemblyVersion debe ser una coincidencia exacta para la unión a tener éxito.Por ejemplo, si hace referencia a la versión 1.0.0.0 de un ensamblado de nombre al momento de construir, pero sólo la versión 1.0.0.1 de que la asamblea está disponible en tiempo de ejecución, la unión va a fallar!(Usted entonces tiene que trabajar alrededor de este uso Ensamblado De Redirección De Enlace.)

La confusión sobre si la totalidad de la AssemblyVersion tiene que coincidir.(Sí, sí.)

Hay un poco de confusión en torno a si la totalidad de la AssemblyVersion tiene que ser una coincidencia exacta en orden, para que una asamblea para ser cargado.Algunas personas están bajo la falsa creencia de que sólo las Grandes y pequeñas piezas de la AssemblyVersion tienen que coincidir para que la unión a tener éxito.Esta es una buena suposición, sin embargo en última instancia es incorrecta (como de .NET 3.5), y es trivial comprobar esto para su versión de CLR.Simplemente ejecutar este código de ejemplo.

En mi máquina la segunda asamblea de la carga de falla, y las dos últimas líneas de la fusión de registro de dejar perfectamente claro por qué:

.NET Framework Version: 2.0.50727.3521
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
Successfully loaded assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
Assembly binding for  failed:
System.IO.FileLoadException: Could not load file or assembly 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, 
PublicKeyToken=0b3305902db7183f' or one of its dependencies. The located assembly's manifest definition 
does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f'

=== Pre-bind state information ===
LOG: User = Phoenix\Dani
LOG: DisplayName = Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
 (Fully-specified)
LOG: Appbase = [...]
LOG: Initial PrivatePath = NULL
Calling assembly : AssemblyBinding, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.
LOG: Post-policy reference: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
LOG: Attempting download of new URL [...].
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Creo que el origen de esta confusión es probablemente debido a que Microsoft originalmente diseñado para ser un poco más tolerantes en este estricta coincidencia de la plena AssemblyVersion, haciendo coincidir sólo en la versión Principal y secundaria partes:

"Cuando se carga un ensamblado, el CLR encontrará automáticamente la última instalado el servicio de mantenimiento de la versión que coincide con el mayor/menor de la versión de la la asamblea que se solicita." — Jeffrey Richter, [CLR a través de C# (Segunda Edición)] p.56

Este fue el comportamiento en la Beta 1 de la 1.0 CLR, sin embargo esta característica se ha retirado antes de la versión 1.0, y no ha logrado volver a la superficie en .NET 2.0:

"Nota:He descrito cómo debe pensar en los números de versión.Por desgracia, el CLR no tratar los números de versión de esta manera.[En .NET 2.0], el CLR trata de un número de versión como un cuerpo opaco valor, y si una asamblea depende de la versión 1.2.3.4 de otro de la asamblea, el CLR intenta cargar versión 1.2.3.4 solo (a menos que la unión la redirección está en su lugar).Sin embargo, Microsoft tiene planes para cambiar el CLR del cargador en una futura versión que se carga la última construir/revisión para un dado mayor/menor versión de un ensamblado.Por ejemplo, en una futura versión de CLR, si el cargador está tratando de encontrar la versión 1.2.3.4 de una asamblea y la versión 1.2.5.0 existe, el cargador automáticamente recoger los últimos mantenimiento de versión.Esta será una muy cambio bienvenido a la CLR cargador — I para que uno no puede esperar." — Jeffrey Richter, [CLR a través de C# (Segunda Edición)] p.164 (Énfasis la mía)

Como este cambio aún no ha sido implementada, creo que es seguro asumir que Microsoft sigue en esta intención, y tal vez es demasiado tarde para cambiar ahora.Traté de buscar en la web para averiguar lo que sucedió con estos planes, pero no pude encontrar ninguna respuesta.Yo todavía quería llegar a la parte inferior de la misma.

Así que le envié un correo a Jeff Richter y le preguntó directamente — pensé que si alguien sabía lo que había pasado, sería él.

Él respondió: dentro de las 12 horas, en una mañana de sábado no menos, y aclaró que el .NET 1.0 Beta 1 cargador hizo implementar esta automáticos de roll-forward " mecanismo de recoger la última Compilación y Revisión de una asamblea, pero este comportamiento se revirtió antes .NET 1.0 enviado.Más tarde fue la intención de revivir esto pero no lo hacen antes de que el CLR 2.0 enviado.Luego vino Silverlight, que tuvo prioridad para el CLR equipo, por lo que esta funcionalidad se retrasa más.En tanto, la mayoría de la gente que tenía alrededor en los días de CLR 1.0 Beta 1 se han alejado, por lo que es poco probable que esto se vea la luz del día, a pesar de todo el trabajo duro que ya se habían puesto en él.

El comportamiento actual, parece, está aquí para quedarse.

Es también digno de mención de mi discusión con Jeff que AssemblyFileVersion fue añadido después de la eliminación de la 'automático roll-forward' en el mecanismo, porque después de 1.0 Beta 1, que cualquier cambio en la AssemblyVersion se convierte en un cambio para sus clientes, que no había entonces ningún lugar para almacenar de forma segura su número de compilación.AssemblyFileVersion es que un refugio seguro, ya que nunca automáticamente examinado por el CLR.Tal vez la más clara de esa manera, tiene dos números de versión, con diferentes significados, en lugar de intentar hacer que la separación entre el Mayor/Menor (romper) y la creación/Revisión (de no separación) de las piezas de la AssemblyVersion.

La parte inferior de la línea:Piense con cuidado acerca de cuando usted cambie su AssemblyVersion

La moraleja es que si eres de envío de las asambleas que otros desarrolladores van a ser la referencia, debe ser extremadamente cuidadoso acerca de cuando usted hace (y no) cambiar el AssemblyVersion de dichas asambleas.Cualquier cambio a la AssemblyVersion significa que los desarrolladores de aplicaciones tendrán que volver a compilar en contra de la nueva versión (para actualizar los AssemblyRef entradas) o utilizar el enlace de ensamblado redirige a anular manualmente la unión.

  • No cambiar el AssemblyVersion para una versión de servicio que está diseñado para ser compatible con versiones anteriores.
  • ¿ cambiar el AssemblyVersion para una versión que usted sabe que tiene cambios importantes.

Sólo echar otro vistazo a la versión de atributos en mscorlib:

// Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

Tenga en cuenta que es el AssemblyFileVersion que contiene toda la interesante información de servicio (es la parte de la Revisión de esta versión que indica a qué Service Pack estás en), mientras que la AssemblyVersion se fija en un viejo y aburrido 2.0.0.0.Cualquier cambio a la AssemblyVersion obligaría a todos .NETO de la aplicación de referencia mscorlib.dll para que compile en contra de la nueva versión!

AssemblyVersion bastante estancias internas .NET, mientras que AssemblyFileVersion es lo que Windows ve.Si vas a las propiedades de una asamblea sentado en un directorio y cambie a la ficha versión, la AssemblyFileVersion es lo que verás en la parte de arriba.Si usted ordenar los archivos por los de la versión, esto es lo que se usa Explorer.

El AssemblyInformationalVersion se asigna a la "Versión del Producto" y está destinado a ser puramente "humano-usa".

AssemblyVersion es sin duda el más importante, pero no me salte AssemblyFileVersion, tampoco.Si usted no proporciona AssemblyInformationalVersion, el compilador agrega que para usted por despojarse de la "revisión" de las piezas de su número de versión y salir de los principales.menor de edad.construir.

AssemblyInformationalVersion y AssemblyFileVersion se muestran al ver la "Versión" de la información en un archivo a través del Explorador de Windows mediante la visualización de las propiedades de archivo.Estos atributos, en realidad al ser compilado en un VERSION_INFO recurso que es creado por el compilador.

AssemblyInformationalVersion es la "versión del Producto de valor". AssemblyFileVersion es la "versión del Archivo" valor.

El AssemblyVersion es específico .NET asambleas y es utilizado por el .NETO de la asamblea cargador para saber que versión de un ensamblado para cargar/bind en tiempo de ejecución.

De estos, el único que es absolutamente necesario por .NET es la AssemblyVersion atributo.Por desgracia, también puede causar que la mayoría de los problemas cuando se cambia de forma indiscriminada, especialmente si son fuertes nombrar a sus asambleas.

Para mantener esta pregunta actual es de destacar que AssemblyInformationalVersion es utilizado por NuGet y refleja la versión del paquete incluyendo cualquier pre-lanzamiento sufijo.

Por ejemplo, un AssemblyVersion de 1.0.3.* empaquetado con el asp.net núcleo dotnet-cli

dotnet pack --version-suffix ci-7 src/MyProject

Produce un paquete con la versión 1.0.3-ci-7, que se puede inspeccionar con la reflexión mediante:

CustomAttributeExtensions.GetCustomAttribute<AssemblyInformationalVersionAttribute>(asm);

Vale la pena señalar algunas otras cosas:

1) Como se muestra en el Explorador de Windows cuadro de diálogo Propiedades para el ensamblado generado el archivo, hay dos lugares llamados "versión del Archivo".La que se muestra en el encabezado del cuadro de diálogo muestra la AssemblyVersion, no la AssemblyFileVersion.

En la Otra versión de la sección de información, hay otro elemento que llama "Versión del Archivo".Aquí es donde usted puede ver lo que se escribe como la AssemblyFileVersion.

2) AssemblyFileVersion es sólo texto plano.No tienen que conformar con el esquema de numeración de las restricciones que AssemblyVersion ¿(<build> < 65K, por ejemplo).Se puede 3.2.<release tag="" text="">.<datetime>, si te gusta.Su sistema de construcción a fin de cumplimentar las fichas.

Por otra parte, no está sujeto al comodín de reemplazo que AssemblyVersion es.Si usted acaba de tener un valor de "3.0.1.*" en el AssemblyInfo.cs, que es exactamente lo que se mostrará en la Otra versión de la información->Versión de Archivo del elemento.

3) no sé el impacto que un instalador de usar algo que no sea numérico números de versión de archivo, sin embargo.

Cuando una asamblea' s AssemblyVersion es cambiado, Si también tiene un gran nombre, la referencia a los ensamblados necesitan ser recompilados, de lo contrario, la asamblea no se carga!Si no tiene un nombre, si no se agrega a un archivo de proyecto, no se copiará en el directorio de salida al construir lo que se puede perder la función de las asambleas, especialmente después de limpiar el directorio de salida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top