.net null assemblyversionattribute

.net - GetCustomAttribute() devuelve nulo para AssemblyVersionAttribute



null (3)

Estoy agregando un cuadro de diálogo Acerca de a mi aplicación .NET y estoy consultando los atributos del ensamblaje para obtener información para mostrar. Cuando intento recuperar el AssemblyVersionAttribute de mi ensamblaje utilizando GetCustomAttribute() , devuelve un null :

// 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")]

¿Cual es el trato? 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();


El AssemblyVersionAttribute no se agrega al ensamblaje, pero el compilador lo trata de manera "especial" (es decir, establece la versión del ensamblaje)

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

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

Todos estos atributos se enumeran en los Atributos de identidad de ensamblaje en la documentación. La documentación dice esto acerca de estos atributos:

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


No estoy seguro de por qué se comporta de esta manera. En lugar de ir tras el atributo AssemblyVersion, hacemos esto:

Version AssemblyVersion = someAssembly.GetName().Version;

Para AssemblyFileVersion utilizamos:

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); }


Su ejemplo no es una solución alternativa. Es exactamente lo que indica la documentación de MSDN que debe hacer, lo que me lleva a creer que el código es un diseño original.
AssemblyVersionAttribute

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