为什么可以';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没有读取它呢?
如果您只想获得程序集版本,那么它是非常直接的:
Console.WriteLine("The version of the currently executing assembly is: {0}", Assembly.GetExecutingAssembly().GetName().Version);
该属性是System.Version的一种类型,具有Major
、Minor
、Build
和Revision
属性。
例如。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));