2011-10-14 23 views

Respuesta

53
using System.Reflection.Assembly 
using System.Diagnostics.FileVersionInfo 

// ... 

public string GetInformationalVersion(Assembly assembly) { 
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; 
} 
+0

Consulte http://stackoverflow.com/a/19008850/116895 – lance

+7

Tenga en cuenta que este código no funciona si el ensamblado no se ha cargado desde un archivo o un UNC. Este podría ser el caso si el ensamblaje está incrustado en otro ensamblaje (generalmente cuando se ofuscan ensamblajes) o por alguna otra razón se ha cargado usando 'Assembly.Load (byte [])' – larsmoa

+2

. Tampoco funciona si tiene 'mkbundle '' d su aplicación para Mono – Cocowalla

34
var attr = Assembly 
    .GetEntryAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[]; 

Es un conjunto de AssemblyInformationalVersionAttribute. No es nulo incluso si no hay ningún atributo del tipo buscado.

var attr2 = Attribute 
    .GetCustomAttribute(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute; 

Esto puede ser nulo si el atributo no está presente.

var attr3 = Attribute 
    .GetCustomAttributes(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[]; 

Igual que el primero.

+1

+1; pero puede usar 'GetCustomAttribute' en lugar de' GetCustomAttributes' si sabe que solo habrá un atributo. – vcsjones

+3

@vcsjones Solo usando el método estático de 'Attribute', no usando el método de instancia de' Assembly' – xanatos

+1

En algunas situaciones, 'Assembly.GetEntryAssembly()' debe reemplazarse por 'Assembly.GetExecutingAssembly()' o 'Assembly. GetCallingAssembly() '. Normalmente, esto es necesario si el ensamblado es un complemento; en este caso, 'GetEntryAssembly()' devolverá el ensamblado de la aplicación de host. – larsmoa

7
AssemblyInformationalVersionAttribute attribute = 
    (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); 

if (attribute != null) 
    Console.WriteLine(attribute.InformationalVersion); 
+0

+1 ya que esto también funciona con Silverlight o Xbox Lakeview. – ahilsend

10

Incluso si la pregunta es un poco antigua:

propongo una solución diferente que funciona para mí:

Application.ProductVersion 
+4

Me costó encontrarla en WPF, es la clase de aplicación Winforms. :-) – Wouter

3

Para complementar la respuesta de la lanza: Puede utilizar Application.ResourceAssembly.Location a averigua la ruta del archivo de tu ensamblaje. Con esto, es posible obtener la cadena AssemblyInformationalVersion en una sola línea

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion 
8

El uso de un tipo conocido en su aplicación puede simplemente hacer esto:

using System.Reflection; 

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; 

Por supuesto, cualquier proceso que se utiliza para llegar a la El ensamblaje al que se aplica su atributo es bueno. Tenga en cuenta que esto no se basa en System.Diagnostics ni en el objeto Application de WinForm.

0

edificio fuera de la respuesta de @ Aerthal, si quieres un un trazador de líneas para conseguir el AssemblyInformationalVersionAttribute de un MVC Razor Ver:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion 
Cuestiones relacionadas