为什么可以';t我使用反射加载AssemblyVersion属性

本文关键字:反射 加载 属性 AssemblyVersion 为什么 | 更新日期: 2023-09-27 17:59:11

assemblyinfo.cs文件具有AssemblyVersion属性,但当我运行以下内容时:

Attribute[] y = Assembly.GetExecutingAssembly().GetCustomAttributes();

我得到:

System.Runtime.InteropServices.ComVisibleAttribute
System.Runtime.CompilerServices.RuntimeCompatibilityAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.InteropServices.GuidAttribute
System.Diagnostics.DebuggableAttribute
System.Reflection.AssemblyTrademarkAttribute
System.Reflection.AssemblyCopyrightAttribute
System.Reflection.AssemblyCompanyAttribute
System.Reflection.AssemblyConfigurationAttribute
System.Reflection.AssemblyFileVersionAttribute
System.Reflection.AssemblyProductAttribute
System.Reflection.AssemblyDescriptionAttribute

然而,我已经无数次检查了这个属性是否存在于我的代码中:

 [assembly: AssemblyVersion("5.5.5.5")]

如果我尝试直接访问它,我会得到一个异常:

Attribute x = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyVersionAttribute)); //exception

我想我将无法使用该属性,但为什么.NET没有读取它呢?

为什么可以';t我使用反射加载AssemblyVersion属性

如果您只想获得程序集版本,那么它是非常直接的:

Console.WriteLine("The version of the currently executing assembly is: {0}", Assembly.GetExecutingAssembly().GetName().Version);

该属性是System.Version的一种类型,具有MajorMinorBuildRevision属性。

例如。1.2.3.4版本的程序集具有:

  • Major=1
  • Minor=2
  • Build=3
  • Revision=4

我将重复Hans Passant的评论:

[AssemblyVersion]在.NET中真的很重要。编译器对属性进行特殊处理,在生成程序集的元数据时使用它。而实际上并没有发射属性,这将是两次发射。请改用AssemblyName.Version,如图所示。

(只是为了完善获得版本的口味…)

如果您试图获取任意程序集(即不是加载/运行的程序集)上的文件版本信息,则可以使用FileVersionInfo,但请注意,这可能与元数据中指定的AssemblyVersion不同:

var filePath = @"c:'path-to-assembly-file";
FileVersionInfo info = FileVersionInfo.GetVersionInfo(filePath);
// the following two statements are roughly equivalent
Console.WriteLine(info.FileVersion);
Console.WriteLine(string.Format("{0}.{1}.{2}.{3}", 
         info.FileMajorPart, 
         info.FileMinorPart, 
         info.FileBuildPart, 
         info.FilePrivatePart));