GetCustomAttribute()用于AssemblyVersionAttribute返回nu

2019-07-30 09:24发布

我添加了关于对话框我的.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();

Answer 1:

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

你可以得到AssemblyFileVersion属性(即这一项被添加到组装)

有迹象表明,表现出同样的行为的其他属性: AssemblyCultureAttributeAssemblyFlagsAttribute也可用于安装组件的属性,和自定义属性不添加到装配。

所有这些属性都列在大会标识的文档中的属性 。 该文件说,这个有关这些属性:

三个属性,具有较强的名字联系在一起(如适用),确定集的标识:名称,版本,和文化。



Answer 2:

你举的例子不是一个变通。 这正是MSDN文档指出,你应该做的,这使我相信,代码是设计的。
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

为了获取名称[原文]你所加载的程序集,调用GetName在大会得到AssemblyName ,然后获取Version属性。 为了让您有没有加载的程序集的名字,叫GetAssemblyName从客户端应用程序来检查您的应用程序使用的程序集版本。



Answer 3:

不知道为什么它的行为这样。 相反的,我们这样做的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);
}


文章来源: GetCustomAttribute() returns null for AssemblyVersionAttribute