2009-07-17 20 views
19

Agrego un diálogo Acerca de a mi aplicación .NET y consulto los atributos del ensamblado para que se muestre la información. Cuando intento para recuperar de mi AssemblyVersionAttribute conjunto usando GetCustomAttribute() vuelve null:GetCustomAttribute() devuelve nulo para AssemblyVersionAttribute

// Works fine 
AssemblyTitleAttribute title 
    = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(
     someAssembly, typeof(AssemblyTitleAttribute)); 

// Gets null 
AssemblyVersionAttribute version 
    = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(
     someAssembly, typeof(AssemblyVersionAttribute)); 

Mi AssemblyInfo.cs parece estar bien. Tengo estos atributos definidos:

[assembly: AssemblyTitle("Some Application")] 
[assembly: AssemblyVersion("1.0.0.0")] 

¿Cuál es el problema? Tengo una solución alternativa, pero me gustaría saber por qué el código anterior no funciona.

// Work-around 
string version = someAssembly.GetName().Version.ToString(); 
+0

Si estás en Windows Forms, sólo se puede usar 'Application.ProductVersion' – nawfal

Respuesta

17

El AssemblyVersionAttribute no se añade a la asamblea, pero se trata de una manera "especial" por el compilador (es decir, se establece la versión del ensamblado)

Puede obtener el atributo AssemblyFileVersion (es decir, este se agrega al ensamblaje)

Existen otros atributos que muestran el mismo comportamiento: AssemblyCultureAttribute y AssemblyFlagsAttribute también se usan para establecer las propiedades del ensamblaje y no se agregan al ensamblaje como atributos personalizados.

Todos estos atributos se enumeran en Atributos de identidad de conjunto en la documentación. La documentación dice esto sobre estos atributos:

Tres atributos, junto con un nombre seguro (si corresponde), determinan la identidad de un conjunto: nombre, versión y cultura.

+1

parece que es tratado de manera diferente porque en realidad se considera un "atributo pseudo personalizado", no un atributo personalizado regular. –

7

Su ejemplo no es una solución temporal. Es exactamente lo que indica la documentación de MSDN que debe hacer, lo que me lleva a pensar que el código es de diseño.
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

para obtener el nombre [sic] de un montaje que ha cargado, llame GetName en el conjunto para obtener una AssemblyName, y luego obtener la propiedad Version. Para obtener el nombre de un ensamblaje que no ha cargado, llame al GetAssemblyName desde su aplicación cliente para verificar la versión de ensamblaje que utiliza su aplicación.

5

No estoy seguro de por qué se comporta de esta manera. En vez de ir después de la AssemblyVersionAttribute hacemos esto:

Version AssemblyVersion = someAssembly.GetName().Version; 

Para AssemblyFileVersion usamos:

Version fileVersion = new Version("0.0.0.0"); 
AssemblyFileVersionAttribute[] fileVersionAttributes = (AssemblyFileVersionAttribute[])assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true); 
if (fileVersionAttributes != null && fileVersionAttributes.Length > 0) { 
    fileVersion = new Version(fileVersionAttributes[0].Version); 
} 
Cuestiones relacionadas