获取 .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<T>
,并且认为这个变体更具可读性。
另请参阅Microsoft Docs on GetCustomAttribute<T>(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 值?的主要内容,如果未能解决你的问题,请参考以下文章
制作 C++/MFC 应用程序以从其他应用程序中提取 AssemblyInfo?