获取.NET程序集的AssemblyInformationalVersion值?

时间:2011-10-14 15:40:45

标签: c# .net

在运行时获取程序集的AssemblyInformationalVersion属性值的C#语法是什么?例如:

[assembly: AssemblyInformationalVersion("1.2.3.4")]

10 个答案:

答案 0 :(得分:62)

using System.Reflection.Assembly  
using System.Diagnostics.FileVersionInfo

// ...

public string GetInformationalVersion(Assembly assembly) {
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
}

答案 1 :(得分:38)

var attr = Assembly
    .GetEntryAssembly()
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[];

这是AssemblyInformationalVersionAttribute的数组。即使没有搜索类型的属性,它也不会为空。

var attr2 = Attribute
    .GetCustomAttribute(
        Assembly.GetEntryAssembly(), 
        typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute;

如果该属性不存在,则该值为null。

var attr3 = Attribute
    .GetCustomAttributes(
         Assembly.GetEntryAssembly(), 
         typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[];

与第一次相同。

答案 2 :(得分:16)

在您的应用程序中使用已知类型,您只需执行此操作:

using System.Reflection;

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;

当然,您用于获取属性所应用的程序集的任何过程都是好的。请注意,这不依赖于System.Diagnostics或WinForm的Application对象。

答案 3 :(得分:12)

即使问题有点旧:

我提出了一个适合我的不同解决方案:

Application.ProductVersion

答案 4 :(得分:7)

答案 5 :(得分:5)

补充lance的答案:您可以使用Application.ResourceAssembly.Location找出程序集的文件路径。有了这个,就可以在一行中获得AssemblyInformationalVersion字符串

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion

答案 6 :(得分:0)

答案 7 :(得分:0)

建立@Aerthal的答案,如果你想要一个单行程序从MVC Razor View获取AssemblyInformationalVersionAttribute:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion

答案 8 :(得分:0)

实用方法

鉴于从PE标头中检索日期可能不够可靠,因此有一种方法可以将其他属性包含到您的[assembly: AssemblyVersion("1.0.0")] [assembly: AssemblyFileVersion("1.0.0")] // and this: [assembly: AssemblyInformationalVersion("1.0.0 (Build Date: 14.07.2020)")]

AssemblyInfo.cs

该字符串应可读,因为最终用户可以看到该字符串。但是,如果您坚持使用特定格式,则可以轻松,可靠性对其进行解析。

注意:我们正在使用Jenkins构建服务器,该服务器将版本信息以及日期字符串写入var object = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; _.uniqWith(object, _.isEqual); // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] 中。

enter image description here

答案 9 :(得分:0)

public static string GetInformationalVersion() =>
    Assembly
        .GetEntryAssembly()
        .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
        .InformationalVersion;

虽然我的答案与其他答案相似,但我认为它具有一些优点:

  • 它确定输入程序集的信息版本。这意味着该代码可以驻留在更大项目中的库中,并且无需任何依赖即可获得“用户双击的程序”的版本。
    • 如果要获取代码所在的程序集的版本(即库而不是主程序),可以将GetEntryAssembly()替换为GetExecutingAssembly()
  • 它不能通过查看文件来确定信息版本。在某些情况下,I / O操作是不必要的,甚至是不可能的(我正在考虑某些单文件打包方法,AoT变体,从UNC路径执行的软件等)。
  • 它与@xanatos的答案具有上述两个方面,但是我更喜欢使用通用扩展方法GetCustomAttribute<T>,并且认为此变体更易读。

另请参阅{{3}}。