¿Cómo puedo obtener la versión del archivo de ensamblaje?

727

En AssemblyInfohay dos versiones de montaje:

  1. AssemblyVersion: Especifique la versión del ensamblado que se atribuye.
  2. AssemblyFileVersion: Indica a un compilador que use un número de versión específico para el recurso de versión del archivo Win32. No se requiere que la versión del archivo Win32 sea la misma que el número de versión del ensamblado.

Puedo obtener el Assembly Versioncon la siguiente línea de código:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Pero, ¿cómo puedo obtener el Assembly File Version?

Enyra
fuente
2
¿Qué quiere decir con "versión de archivo de ensamblaje" en lugar de "versión de ensamblaje"? ¿Puede dar un ejemplo?
Xiaofu
77
@Xiaofu - "Versión de ensamblaje" es lo que .NET usa internamente. "Versión del archivo de ensamblaje" es lo que se muestra cuando hace clic derecho en un archivo y va a "propiedades" y luego a la pestaña "detalles". Ellos no son los mismos.
rory.ap
Descubrí que la versión de ensamblaje es la que se usa al determinar la ubicación de user.config en AppData.
Kyle Delaney

Respuestas:

867

Vea mi comentario anterior pidiendo aclaraciones sobre lo que realmente quiere. Ojalá sea este:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
fuente
44
@Xiaofu: ¿Hay alguna forma de obtener los números de versión de un archivo AssemblyInfo.cs en su lugar?
Markus
56
Un problema con este código es que, en realidad, devolverá 1.0. *. * Si no ha especificado números de compilación y revisión. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); obtendrá el número de versión 'compilado', que debería ser el mismo que FileVersion, si configura ambas versiones de la misma manera.
Doguhan Uluca
17
@DoguhanUluca Son dos cosas diferentes. Eso le dará la versión de ensamblaje, no la versión del archivo. "Si configura ambas versiones de la misma manera" es una solución, no una solución.
Nyerguds
1
¿ FileVersionInfoSolo tiene stringpropiedades y no tiene Versionpropiedades?
Kyle Delaney
3
@ Itzjak: Assembly.GetEntryAssembly()devuelve NULL, por ejemplo, en el contexto de los complementos de Office, y también en muchos otros casos. Además, si piensa en complementos / complementos: EntryAssembly es la aplicación de host, y la mayoría de las veces desea la versión de YourCode (TM) :) Aparte de eso, vale la pena agregar a esta respuesta que la assembly.Locationutilizada en la respuesta también puede ser nula (es decir, primer caso aleatorio buscado en Google: github.com/Azure/azure-functions-host/issues/1233 ) y eso probablemente ocurre incluso con más frecuencia que tener un ensamblaje de entrada nulo.
quetzalcoatl
209

Hay tres versiones : ensamblaje , archivo y producto . Son utilizados por diferentes características y toman diferentes valores predeterminados si no los especifica explícitamente.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Check6
fuente
17
Para cuando esa publicación del blog desaparezca algún día, aquí se reduce a referencia:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD
3
Y para aquellos que quieran especificar esto en el archivo AssemblyInfo.cs, para el uso de AssemblyVersion (con los números que desee) === [assembly: AssemblyVersion("2.0.*")]para fileVersion use === [assembly: AssemblyFileVersion("2.0.*")]y para productVersion use === [assembly: AssemblyInformationalVersion("2.0.*")] El último puede tener sufijo de cadena por SemVercompatibilidad:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm
Anexo: AssemblyFileVersionno puede usar la *notación de sufijo. :( Necesita los cuatro números.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm
66

Cuando quiero acceder a la versión del archivo de la aplicación (lo que está configurado en Información de ensamblaje -> Versión del archivo), digamos que para configurar el texto de una etiqueta en la carga del formulario para mostrar la versión, acabo de usar

versionlabel.Text = "Version " + Application.ProductVersion;
sintaxis
fuente
53
Tenga en cuenta que esto requiere una referencia a System.Windows.Forms, por lo que podría no ser adecuado para todas las aplicaciones.
BradleyDotNET
2
Desafortunadamente, eso es una cadena. No es ideal si desea formatearlo usted mismo en un formato más simple "v1.08". Mucho más práctico si realmente obtiene el objeto de versión para obtener los subcomponentes como enteros.
Nyerguds
1
Además, esto recoge AssemblyFileVersion de AssemblyInfo, no AssemblyVersion, así que ten cuidado
dario_ramos
¿Podría un usuario de alta reputación editar esta respuesta para dejar más claro que esto es solo para formularios Windows Forms?
jrh
Esto es exactamente lo que estaba buscando, ¡gracias por la respuesta!
David Refoua
23

ACTUALIZACIÓN: Como lo mencionó Richard Grimes en mi publicación citada , @Iain y @Dmitry Lobanov, mi respuesta es correcta en teoría pero incorrecta en la práctica.

Como debería haber recordado de innumerables libros, etc., mientras uno establece estas propiedades usando [assembly: XXXAttribute], el compilador las roba y las coloca en el VERSIONINFOrecurso.

Por la razón anterior, debe usar el enfoque en la respuesta de @ Xiaofu ya que los atributos se eliminan después de que se les extrae la señal.


cadena estática pública GetProductVersion ()
{
  Var atributo = (AssemblyVersionAttribute) Asamblea
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), verdadero)
    .Soltero();
   atributo de retorno. Versión informativa;
}

(De http://bytes.com/groups/net/420417-assemblyversionattribute , como se indica allí, si está buscando un atributo diferente, sustitúyalo por el anterior)

Ruben Bartelink
fuente
Hola Ruben, 2 notas. Primero, la pregunta formulada para AssemblyFileVersion no AssemblyVersion. Segundo, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) devuelve una matriz de longitud 0. Creo que esto se debe a que AssemblyVersionAttribute no es un atributo personalizado.
Iain
En cuanto al primer punto, es por eso que dije "si buscas un atributo diferente, sustitúyelo por el anterior" (IIRC no lo probé). Re el segundo, eso parece plausible pero no tiene tiempo para cavar ...
Ruben Bartelink
Sí, en realidad no puede obtener el atributo AssemblyVersion a través de .GetCustomAttribute (), la versión de ensamblaje solo se puede recuperar a través de la AssemblyName.Versionpropiedad. Pero con cualquier otro atributo es la forma correcta de hacerlo
Dmitrii Lobanov
@DmitryLobanov e Iain Gracias por las indicaciones. Espero que la edición lo cubra lo suficiente como para que valga la pena mantener la respuesta en lugar de eliminarla, ¡hágamelo saber!
Ruben Bartelink
1
Utilicé en AssemblyInformationalVersionAttributelugar de AssemblyVersionAttribute.net core 3.1
Vasya Milovidov
5

Utilizar este:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

O esto:

new Version(System.Windows.Forms.Application.ProductVersion);
Pieter Geerkens
fuente