24

我正在向我的 .NET 应用程序添加一个 About 对话框,并且正在查询程序集的属性以获取要显示的信息。当我尝试检索我的程序集AssemblyVersionAttributeGetCustomAttribute()它来检索我的程序集时,它会返回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();
4

3 回答 3

20

不会添加到程序集中,AssemblyVersionAttribute而是由编译器以“特殊”方式处理(即它设置程序集的版本)

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

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

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

三个属性与强名称(如果适用)一起确定程序集的标识:名称、版本和文化。

于 2009-07-17T17:05:05.803 回答
8

您的示例不是解决方法。这正是 MSDN 文档说明您应该做的,这让我相信代码是设计使然。
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx

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

于 2009-07-17T17:12:32.667 回答
8

不知道为什么它会这样。我们这样做而不是追求 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);
}
于 2009-07-17T17:13:28.750 回答