GetCustomAttribute()为AssemblyVersionAttribute返回null

M. *_*ley 21 .net null assemblyversionattribute

我正在向.NET应用程序添加一个About对话框,我正在查询程序集的属性以显示信息.当我尝试AssemblyVersionAttribute使用GetCustomAttribute()它来检索我的程序集时返回null:

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

// Gets null
AssemblyVersionAttribute version
    = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(
        someAssembly, typeof(AssemblyVersionAttribute));
Run Code Online (Sandbox Code Playgroud)

AssemblyInfo.cs觉得很好.我定义了这些属性:

[assembly: AssemblyTitle("Some Application")]
[assembly: AssemblyVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我有一个解决方法,但我想知道为什么上面的代码不起作用.

// Work-around
string version = someAssembly.GetName().Version.ToString();
Run Code Online (Sandbox Code Playgroud)

Phi*_*ert 18

AssemblyVersionAttribute不添加到装配,而是由编译器在一个"特殊"的方式被处理(即它设置程序集的版本)

你可以获得AssemblyFileVersion属性(即这个属性被添加到程序集中)

还有其他属性显示相同的行为:AssemblyCultureAttributeAssemblyFlagsAttribute也用于设置程序集属性,并且不作为自定义属性添加到程序集中.

所有这些属性都列在文档中的程序集标识属性下.文档说明了这些属性:

三个属性以及强名称(如果适用)确定程序集的标识:名称,版本和文化.


Sam*_*ell 8

你的例子不是解决方法.这正是MSDN文档中您应该做的事情,这使我相信代码是按设计的.
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

要获取已加载的程序集的名称[sic],请调用GetName程序集以获取AssemblyName,然后获取Version属性.要获取尚未加载的程序集的名称,请GetAssemblyName从客户端应用程序调用以检查应用程序使用的程序集版本.


C-P*_*uru 6

不知道为什么它会这样.我们这样做,而不是追随AssemblyVersionAttribute:

Version AssemblyVersion = someAssembly.GetName().Version;
Run Code Online (Sandbox Code Playgroud)

对于AssemblyFileVersion,我们使用:

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);
}
Run Code Online (Sandbox Code Playgroud)