我添加了关于对话框我的.NET应用程序,我查询大会信息显示属性。 当我试图找回我组装的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();
该AssemblyVersionAttribute
不添加到装配,而是由编译器在一个“特殊”的方式被处理(即它设置程序集的版本)
你可以得到AssemblyFileVersion
属性(即这一项被添加到组装)
有迹象表明,表现出同样的行为的其他属性: AssemblyCultureAttribute
和AssemblyFlagsAttribute
也可用于安装组件的属性,和自定义属性不添加到装配。
所有这些属性都列在大会标识的文档中的属性 。 该文件说,这个有关这些属性:
三个属性,具有较强的名字联系在一起(如适用),确定集的标识:名称,版本,和文化。
你举的例子不是一个变通。 这正是MSDN文档指出,你应该做的,这使我相信,代码是设计的。
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx
为了获取名称[原文]你所加载的程序集,调用GetName
在大会得到AssemblyName
,然后获取Version
属性。 为了让您有没有加载的程序集的名字,叫GetAssemblyName
从客户端应用程序来检查您的应用程序使用的程序集版本。
不知道为什么它的行为这样。 相反的,我们这样做的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);
}