【问题标题】:Get the .NET assembly's AssemblyInformationalVersion value?获取 .NET 程序集的 AssemblyInformationalVersion 值?
【发布时间】:2011-12-07 21:02:35
【问题描述】:

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

[assembly: AssemblyInformationalVersion("1.2.3.4")]

【问题讨论】:

    标签: c# .net


    【解决方案1】:
    using System.Reflection.Assembly  
    using System.Diagnostics.FileVersionInfo
    
    // ...
    
    public string GetInformationalVersion(Assembly assembly) {
        return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
    }
    

    【讨论】:

    • 请注意,如果程序集尚未从文件或 UNC 加载,则此代码不起作用。如果程序集嵌入到另一个程序集中(通常是在混淆程序集时)或由于某些其他原因已使用 Assembly.Load(byte[]) 加载,则可能是这种情况
    • 如果你 mkbundle'd 你的 Mono 应用程序也不起作用
    【解决方案2】:
    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[];
    

    和第一个一样。

    【讨论】:

    • +1;但是如果你知道只有一个属性,你可以使用GetCustomAttribute 而不是GetCustomAttributes
    • @vcsjones 只能使用Attribute的静态方法,不能使用Assembly的实例方法
    • 在某些情况下,Assembly.GetEntryAssembly() 应替换为 Assembly.GetExecutingAssembly()Assembly.GetCallingAssembly()。如果程序集是插件,通常这是必需的 - 在这种情况下,GetEntryAssembly() 将返回主机应用程序程序集。
    【解决方案3】:

    在您的应用程序中使用已知类型,您可以简单地执行以下操作:

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

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

    【讨论】:

      【解决方案4】:

      即使问题有点老了:

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

      Application.ProductVersion
      

      【讨论】:

      • 我很难在 WPF 中找到它,它是 Winforms 应用程序类。 :-)
      • 有什么理由不使用这个变种吗?与此相比,所有其他答案看起来都过于复杂。
      • @Rev1.0 如果您不使用 WinForms,您将 > 5 Megs 加载到 RAM 中只是为了方便程序员。
      【解决方案5】:
      AssemblyInformationalVersionAttribute attribute = 
         (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly()
         .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault();
      
      if (attribute != null)
           Console.WriteLine(attribute.InformationalVersion);
      

      【讨论】:

      • +1 因为这也适用于 Silverlight 或 Xbox Lakeview!
      • 这在 .NET 5 中对我有用。
      【解决方案6】:
      public static string GetInformationalVersion() =>
          Assembly
              .GetEntryAssembly()
              .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
              .InformationalVersion;
      

      虽然我的回答与其他一些人相似,但我认为它有一些优势:

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

      另请参阅Microsoft Docs on GetCustomAttribute&lt;T&gt;(Assembly)

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          【讨论】:

          • 得到AssemblyVersionAttribute定义的版本,而不是AssemblyInformationalVersionAttribute
          【解决方案9】:

          基于@Aerthal 的回答,如果您想要一个从 MVC Razor 视图中获取 AssemblyInformationalVersionAttribute 的衬垫:

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

          【讨论】:

            【解决方案10】:

            实用方法

            鉴于从 PE 标头中检索日期可能不够可靠,有一种方法可以在您的 AssemblyInfo.cs 中包含其他属性

            [assembly: AssemblyVersion("1.0.0")]
            [assembly: AssemblyFileVersion("1.0.0")]
            
            // and this:
            [assembly: AssemblyInformationalVersion("1.0.0 (Build Date: 14.07.2020)")]
            

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

            注意:我们使用的是 Jenkins 构建服务器,它将版本信息连同日期字符串一起写入 AssemblyInfo.cs

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-03
              • 2011-01-04
              • 1970-01-01
              • 1970-01-01
              • 2019-01-14
              • 2010-12-27
              • 1970-01-01
              相关资源
              最近更新 更多