如何获取程序集文件版本

问题描述 投票:0回答:6

AssemblyInfo
中有两个组装版本:

  1. AssemblyVersion
    :指定所归属的程序集的版本。
  2. AssemblyFileVersion
    :指示编译器对 Win32 文件版本资源使用特定版本号。 Win32 文件版本不需要与程序集的版本号相同。

我可以通过以下代码行获得

AssemblyVersion

Version version = Assembly.GetEntryAssembly().GetName().Version;

但是我怎样才能得到

AssemblyFileVersion
呢?

c# .net assemblies version
6个回答
1003
投票

请参阅我上面的评论,要求澄清您真正想要什么。希望就是这样:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

292
投票

三个版本程序集文件产品(又名程序集信息版本)。它们由不同的功能使用,并且如果您没有明确指定它们,则采用不同的默认值。

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

92
投票

当我想访问应用程序文件版本(在程序集信息 - >文件版本中设置的内容)时,比如说在表单加载时为其设置标签文本以显示版本,我刚刚使用了

versionlabel.Text = "Version " + Application.ProductVersion;

此方法需要参考

System.Windows.Forms


28
投票

更新:正如 Richard Grimes 在我引用的帖子、@Iain 和 @Dmitry Lobanov 中提到的,我的答案在理论上是正确的,但在实践中是错误的。

正如我应该从无数书籍等中记住的那样,当使用

[assembly: XXXAttribute]
设置这些属性时,它们会被编译器劫持并放入
VERSIONINFO
资源
中。

由于上述原因,您需要使用@Xiaofu的回答中的方法,因为在从中提取信号后,属性将被剥离。


公共静态字符串 GetProductVersion()
{
  var 属性 = (AssemblyVersionAttribute)Assembly
    .GetExecutingAssembly()
    .GetCustomAttributes( typeof(AssemblyVersionAttribute), true )
    。单身的();
   返回属性.InformationalVersion;
}

(来自 http://bytes.com/groups/net/420417- assemblyversionattribute - 如那里所述,如果您正在寻找不同的属性,请将其替换为上面的属性)


14
投票

使用这个:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

或者这个:

new Version(System.Windows.Forms.Application.ProductVersion);

1
投票

交叉发布我在“非常相似的问题”中的答案,因为我在谷歌上搜索自己的答案并最终来到这里。我认为与此处显示的其他方法相比,以下方法具有一些优点。原答案如下。

public static string? GetInformationalVersion() => Assembly .GetEntryAssembly() ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>() ?.InformationalVersion;
虽然我的答案与其他一些人类似,但我认为它有一些优点:

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

上的

Microsoft 文档。

© www.soinside.com 2019 - 2024. All rights reserved.