如何从文件路径获取.exe文件版本号


76

我在C#中将.Net 3.5 / 4.0与代码一起使用。

我正在尝试在C:驱动器上获取exe文件的版本号。

例如,路径为:c:\ Program \ demo.exe。如果demo.exe的版本号是1.0。

我如何使用此路径获取版本号?

Answers:


149

您可以使用FileVersionInfo.FileVersion从路径中获取它。

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.FileVersion; // Will typically return "1.0.0.0" in your case

9
“ .ProductVersion”不是“文件的版本号”。这应该与文件版本(“ .FileVersion”)区分开。请参阅我的扩展示例。而且,这两个版本都可以包含四个部分,通常您可以得到这四个部分,因此“ 1.0.0”是不典型的,“ 1.0.0.0”是典型的。
Philm 2014年

有时这可行,有时其他不起作用……任何线索?
gumuruh'5

33

更新和更新了2018年(例如,C#6的字符串插值):

接受的答案部分不正确(ProductVersion通常不返回由三部分组成的版本),并且有点误导性:

这是一个更完整的答案。为了使主体文本不太冗长,我将其拆分为简短的摘要,对于很多人来说这可能“足够”。您没有义务阅读第二部分的详细内容,因此请不要tl; dr :-)

简短的摘要:

  1. 每个文件都有不同的版本(程序集版本,文件版本,产品版本),但是通常您将使它们全部等于在文件级别上不会出现“版本地狱”(这将足够早了)。

  2. 文件版本(在资源管理器中可见,并在设置/安装中使用)是我要打扰的最重要的版本。

  3. 为此,只需在AssemblyInfo.cs文件中注释掉文件版本,如下所示。这样可确保一个文件的三个可能的不同版本相同!

    [assembly:AssemblyVersion(“ 1.1.2。”)]
    // [assembly:AssemblyFileVersion(“ 1.1.2。
    ”)]

  4. 例如,对于语义版本控制,您只希望从4个版本中获取3个版本部分:

对每个Visual Studio生成都有一个自动生成计数是有用的。但是,这种内部计数并不是总是有用的,它可以告诉您的内部或外部客户。因此,对于在标题对话框中提及Windows的文件版本,我建议仅显示v1.2.3的三个部分(当然还有语义版本控制):

using System.Diagnostics;
...

var versInfo= FileVersionInfo.GetVersionInfo(pathToVersionedFile); 
string fileVersionFull = versInfo.FileVersion; // No difference here for versinfo.ProductVersion if recommendation in AssemblyInfo.cs is followed
string fileVersionSemantic = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
string fileVersionFull2 =    $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}.{versInfo.FilePrivatePart}";

FileVersionFull2只是显示如何处理所有4个部分,除了“ V”部分与FileVersionFull相同。

细节:

首先是有关如何获取和设置三个版本的备忘单:

文件版本: [assembly:AssemblyFileVersion(..)] => System.Diagnostics.FileVersionInfo.FileVersion

产品版本: [assembly:AssemblyInformationalVersion(..)] => System.Diagnostics.FileVersionInfo.ProductVersion

组装版本: [assembly:AssemblyVersion(..)] => System.Reflection.Assembly.Version

特别是默认设置可能会造成混淆。推荐的SO链接以了解详细信息:FileVersionInfo和AssemblyInfo

EntryAssembly与ExecutingAssembly
要全面考虑每种情况以获取正在运行的应用程序的版本,请在其他位置搜索以获取更多详细信息,例如:这里: 哪种方法更适合获取程序集的位置,GetAssembly()。Location或GetExecutingAssembly()。Location
尤其是可以如果应该使用EntryAssembly或ExecutingAssembly,请感到困惑。他们都有优势和警告。如果以下代码与.exe不在同一程序集中,例如在辅助程序集中,则情况将变得更加复杂。通常,您随后将使用EntryAssembly来获取.exe的版本。
但是:为了使Visual Studio中的单元测试能够测试并行.exe项目中的例程,GetEntryAssembly()不起作用(我的环境:NUnit,VS2017)。但是GetExecutingAssembly()至少不会崩溃,只有在单元测试期间,您才能获得测试项目的程序集版本。对我来说足够好了。有些情况可能不那么简单。
如果需要,可以忽略静态声明,从而可以在一个程序中获得多个不同程序集的版本。

public static class AppInfo
{
  public static string FullAssemblyName { get; }
  ..

  static AppInfo()
  {
      Assembly thisAssembly = null;
      try
      {
          thisAssembly = Assembly.GetEntryAssembly();
      }
      finally
      {
          if (thisAssembly is null)
              thisAssembly = Assembly.GetExecutingAssembly();
      }
      FullAssemblyName = thisAssembly.Location;
      var versInfo = FileVersionInfo.GetVersionInfo(FullAssemblyName);
      ..
  }
}

产品版本与文件版本:文件的版本
也显示在Windows资源管理器中。我建议最大程度地区分“客户可见”文件(主要是应用程序的主要.exe)中的ProductVersion和FileVersion。但是,当然可以选择区分“主”应用程序的每个文件,并让他们都拥有客户看到的所有“营销” ProductVersion。但是经验表明,过多地同步技术版本和市场版本既没有必要也不便宜。混乱并没有真正减少,成本增加了。因此,本文第一部分中描述的解决方案应该主要这样做。

历史:程序集版本与文件版本: 具有不同版本的原因之一还在于,一个.NET程序集最初可以由多个文件(模块)组成-从理论上讲。Visual Studio不使用此功能,其他地方很少使用。这可能是历史原因,使得有可能区分这两个版本。从技术上讲,程序集版本与.NET相关版本(例如GAC和并排版本)相关,文件版本与经典设置(例如,更新期间覆盖或共享文件)更相关。


22

在接受的答案中,引用了“ pathToExe”。

可以按以下方式检索和使用此路径:

var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion

希望这可以使某人免于执行一些不必要的额外步骤。


3
仅当您要读取当前运行文件的版本号时,这才是正确的。在大多数情况下,您需要读取另一个文件的版本,例如,在创建目录列表时
AaA

6

Program您的班级名称在哪里:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;

5

我不确定这是否是您要寻找的东西,但是:

http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version

它说,

// Get the file version info for the notepad.
FileVersionInfo myFileVersionInfo =  FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\notepad.exe");

// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion);


2

使用它,它可以工作:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();

作品!(为什么是负数?)此方法获取AssemblyVersion,上方的其他方法获取AssemblyFileVersion
Sergio Cabral

0
  • 解决方案1

    Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
    yourLabel.Text = fileVer.FileVersion
    
  • 解决方案2

    获取文件版本号

    yourLabel.Text = Application.ProductVersion
    

两种解决方案都将给出1.0.0.0


否,Application.ProductVersion通常输出1.0.0,而不是1.0.0.0
Momoro '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.