获取 .NET 程序集的 AssemblyInformationalVersion 值?

Posted

技术标签:

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

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

[assembly: AssemblyInformationalVersion("1.2.3.4")]

【问题讨论】:

【参考方案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】:

http://msdn.microsoft.com/en-us/library/system.reflection.assemblyinformationalversionattribute.aspx

查看 InformationalVersion 属性

【讨论】:

得到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

【讨论】:

以上是关于获取 .NET 程序集的 AssemblyInformationalVersion 值?的主要内容,如果未能解决你的问题,请参考以下文章

获取.Net程序集的PublicKeyToken [重复]

获取 .NET 程序集的日期 [重复]

制作 C++/MFC 应用程序以从其他应用程序中提取 AssemblyInfo?

assembly:ContractNamespace(),这个选项在AssemblyInfo.cs文件中不可用?

如何获取代码所在程序集的路径?

如何获取代码所在程序集的路径?