我正在向.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));
我的AssemblyInfo.cs
似乎很好。我定义了这些属性:
[assembly: AssemblyTitle("Some Application")]
[assembly: AssemblyVersion("1.0.0.0")]
这笔交易是什么?我确实有一个解决方法,但我想知道为什么上面的代码不起作用。
// Work-around
string version = someAssembly.GetName().Version.ToString();
答案 0 :(得分:18)
AssemblyVersionAttribute
未添加到程序集中,但编译器以“特殊”方式处理(即设置程序集的版本)
您可以获得AssemblyFileVersion
属性(即此属性已添加到程序集中)
还有其他属性显示相同的行为:AssemblyCultureAttribute
和AssemblyFlagsAttribute
也用于设置程序集属性,并且不会作为自定义属性添加到程序集中。
所有这些属性都列在文档中的程序集标识属性下。文档说明了这些属性:
三个属性以及强名称(如果适用)确定程序集的标识:名称,版本和文化。
答案 1 :(得分:7)
你的例子不是解决方法。这正是MSDN文档中您应该做的事情,这使我相信代码是按设计的 http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx
要获取已加载的程序集的名称[sic],请在程序集上调用
GetName
以获取AssemblyName
,然后获取Version
属性。要获取尚未加载的程序集的名称,请从客户端应用程序中调用GetAssemblyName
以检查应用程序使用的程序集版本。
答案 2 :(得分:6)
不确定为什么它会这样。我们这样做,而不是追踪AssemblyVersionAttribute:
Version AssemblyVersion = someAssembly.GetName().Version;
对于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);
}