获取.NET程序集的AssemblyInformationalVersion值?

lan*_*nce 64 .net c#

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

[assembly: AssemblyInformationalVersion("1.2.3.4")]

lan*_*nce 64

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

// ...

public string GetInformationalVersion(Assembly assembly) {
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果尚未从文件或UNC加载程序集,则此代码不起作用.如果程序集嵌入在另一个程序集中(通常在混淆程序集时)或者由于某些其他原因使用`Assembly.Load(byte [])加载,则可能出现这种情况. (7认同)
  • 如果您已经为Mono申请了mkbundle,也行不通 (2认同)

xan*_*tos 39

var attr = Assembly
    .GetEntryAssembly()
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[];
Run Code Online (Sandbox Code Playgroud)

这是一个阵列AssemblyInformationalVersionAttribute.即使没有搜索类型的属性,它也不会为空.

var attr2 = Attribute
    .GetCustomAttribute(
        Assembly.GetEntryAssembly(), 
        typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute;
Run Code Online (Sandbox Code Playgroud)

如果该属性不存在,则此值可以为null.

var attr3 = Attribute
    .GetCustomAttributes(
         Assembly.GetEntryAssembly(), 
         typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[];
Run Code Online (Sandbox Code Playgroud)

与第一个相同.

  • @vcsjones只使用`Attribute`的静态方法,而不是使用`Assembly`的实例方法 (3认同)

Rob*_*eer 17

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

using System.Reflection;

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
Run Code Online (Sandbox Code Playgroud)

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


wol*_*yst 13

即使这个问题有点旧:

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

Application.ProductVersion
Run Code Online (Sandbox Code Playgroud)

  • 我很难在WPF中找到它,它是Winforms Application类.:-) (5认同)
  • @Rev1.0 如果您不以其他方式利用 WinForms,则将 &gt; 5 Megs 加载到 RAM 中只是为了程序员的方便。 (2认同)

Geo*_*ung 13

public static string? GetInformationalVersion() =>
    Assembly
        .GetEntryAssembly()
        ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
        ?.InformationalVersion;
Run Code Online (Sandbox Code Playgroud)

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

  • 它确定条目程序集的信息版本。这意味着该代码可以驻留在更大项目的库中,并且仍然可以获得“用户双击的程序”的版本,而不需要任何依赖。
    • 如果您想获取代码所在的程序集的版本(即库而不是主程序),您可以替换GetEntryAssembly()GetExecutingAssembly()
  • 它不会通过查看文件来确定信息版本。I/O 操作在某些情况下是不需要的,甚至是不可能的(我正在考虑一些单文件打包方法、AoT 变体、从 UNC 路径执行的软件等)。
  • 它与@xanatos的答案共享上述两个方面,但是我更喜欢使用通用扩展方法,GetCustomAttribute<T>并且认为这个变体更具可读性。
  • 更新 2023-01-04:添加了 null 传播和对可为 null 的引用类型的支持。

另请参阅有关 的 Microsoft 文档GetCustomAttribute<T>(Assembly)


请注意,在像 MAUI Android 这样的 illlink/AoT 场景中,这可能会返回 null。如果您使用自动版本控制解决方案,可能还有其他无反射方法来获取版本信息。例如,如果您正在使用Nerdbank.GitVersioning,您可以使用

public static string? GetInformationalVersion() =>
    ThisAssembly.AssemblyInformationalVersion;
Run Code Online (Sandbox Code Playgroud)


DeC*_*Caf 7

AssemblyInformationalVersionAttribute attribute = 
   (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly()
   .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault();

if (attribute != null)
     Console.WriteLine(attribute.InformationalVersion);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion
Run Code Online (Sandbox Code Playgroud)