为什么我不能使用反射加载AssemblyVersion属性?

时间:2013-02-14 02:15:10

标签: c# .net exception reflection .net-assembly

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怎么没有阅读呢?

3 个答案:

答案 0 :(得分:9)

如果你想要获得程序集版本,那就非常简单了:

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

该属性属于System.Version,其MajorMinorBuildRevision属性。

EG。版本1.2.3.4的程序集包含:

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

答案 1 :(得分:4)

我将重复Hans Passant的评论:

[AssemblyVersion]在.NET中是一个非常重要的事情。编译器特别处理该属性,它在生成程序集的元数据时使用它。并且实际上不会发出属性,这将是两次。请改用AssemblyName.Version,如图所示。

答案 2 :(得分:0)

(只是为了完善获得版本的风格......)

如果您尝试在任意程序集上获取文件版本信息(即,没有一个已加载/正在运行),您可以使用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));