.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 unAssemblyName
y luego obtenga la propiedadVersion
. Para obtener el nombre de un ensamblaje que no ha cargado, llame aGetAssemblyName
desde su aplicación cliente para verificar la versión de ensamblaje que usa su aplicación.