2009-03-31 13 views
32

Estoy trabajando en un programa, y ​​yo estoy tratando de mostrar el conjunto ARCHIVO versiónC# AssemblyFileVersion uso dentro de un programa

public static string Version 
    { 
     get 
     { 
      Assembly asm = Assembly.GetExecutingAssembly(); 
      FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location); 
      return String.Format("{0}.{1}", fvi.FileMajorPart, fvi.FileMinorPart); 
     } 
    } 

Por el momento, esto sólo devuelve los dos primeros números de versión en la "AssemblyVersion", no "AssemblyFileVersion". Realmente me gustaría que acaba de hacer referencia a la AssemblyFileVersion en lugar de almacenar una variable interna llamada "versión" que tengo que actualizar tanto esto como la versión de montaje ...

[assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyFileVersion("3.5.0")] 

Esa es mi AssemblyFileVersion de AssemblyInfo.cs. Me gustaría simplemente hacer referencia a la parte "3.5.x", no el "1.0. *":/

Gracias, Zack

+1

Ya está el 99% del camino, sólo cambia el retorno a fvi.FileVersion – McAden

+0

ver https://stackoverflow.com/a/12528418/492 para obtener la información de la versión de una DLL específico, en lugar de la aplicación de ejecución principal. –

Respuesta

33

Uso ProductMajorPart/ProductMinorPart en lugar de FileMajorPart/FileMinorPart:

public static string Version 
    { 
     get 
     { 
      Assembly asm = Assembly.GetExecutingAssembly(); 
      FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location); 
      return String.Format("{0}.{1}", fvi.ProductMajorPart, fvi.ProductMinorPart); 
     } 
    } 
+0

Err. ¡Me acabo de dar cuenta de que está obteniendo la versión de .dll! No es exactamente lo que quiero. Quiero la versión ejecutable. (Olvidó mencionar que se está llamando desde un .dll) – Zack

+4

Asamblea asm = Assembly.GetEntryAssembly(); – Diadistis

+5

Tenga en cuenta que fvi.FileVersion le dará la cadena formateada directamente (las cuatro partes), si eso es lo que necesita ... – Benjol

1

supongo que tendrá que utilizar la clase FileVersionInfo.

System.Diagnostics.FileVersionInfo.GetVersionInfo(FullpathToAssembly)

+0

El ejemplo que mostré utiliza FileVersionInfo. Pero solo devuelve el atributo "AssemblyVersion". – Zack

+0

¡Uy! Es estúpido por mi parte no ver la pregunta por completo. Lo siento por eso. – shahkalpesh

3

para obtener la versión de la actualidad montaje de ejecución puede utilizar:

using System.Reflection; 
Version version = Assembly.GetExecutingAssembly().GetName().Version; 

La clase Asamblea puede también carga archivos y accede a todos los ensamblajes cargados en un proceso.

+0

es AssemblyVersion, no AssemblyFileVersion – Slava

6
using System.Reflection; 
using System.IO; 

FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location); 

Console.WriteLine("AssemblyVersion : {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString()); 

Console.WriteLine ("AssemblyFileVersion : {0}" , fv.FileVersion.ToString()); 
3
var fileVersion = GetCustomAttributeValue<AssemblyFileVersionAttribute>(assembly, "Version"); 

    private static string GetCustomAttributeValue<T>(Assembly assembly, string propertyName) 
     where T : Attribute 
    { 
     if (assembly == null || string.IsNullOrEmpty(propertyName)) return string.Empty; 

     object[] attributes = assembly.GetCustomAttributes(typeof(T), false);    
     if (attributes.Length == 0) return string.Empty; 

     var attribute = attributes[0] as T; 
     if (attribute == null) return string.Empty; 

     var propertyInfo = attribute.GetType().GetProperty(propertyName); 
     if (propertyInfo == null) return string.Empty; 

     var value = propertyInfo.GetValue(attribute, null); 
     return value.ToString(); 
    } 
+0

¡Esto realmente funciona! – Roboblob

Cuestiones relacionadas