85

我正在使用带有 C# 代码的 .Net 3.5/4.0。

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

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

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

4

8 回答 8

162

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

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.FileVersion; // Will typically return "1.0.0.0" in your case
于 2012-07-05T18:07:17.287 回答
34

2018 年更新和现代化(例如 C#6 的字符串插值):

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

这是一个更完整的答案。为了让正文不太长,我把它分成了一个简短的(呃)摘要,这对很多人来说可能“足够”了。您没有义务阅读详细的第二部分,所以请不要 tl;dr :-)

简短的摘要:

  1. 每个文件都有不同的版本(汇编版本、文件版本、产品版本),但通常你会让它们都等于在文件级别上没有得到“版本地狱”(它会来得足够早)。

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

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

    [程序集:AssemblyVersion("1.1.2. ")]
    //[程序集: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 个部分,除了它包含与FileVersionFull相同的“V” 。

细节:

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

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

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

程序集版本: [程序集: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 和并行版本,文件版本与经典设置更相关,例如在更新期间覆盖或共享文件。

于 2014-04-27T15:18:36.437 回答
23

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

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

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

希望这可以避免有人做一些不必要的额外步骤。

于 2014-06-11T16:04:53.340 回答
6

Program你的班级名称在哪里:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
于 2014-07-17T13:52:07.483 回答
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);
于 2012-07-05T18:08:52.217 回答
2

使用这个,它的工作原理:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
于 2014-01-14T01:24:26.737 回答
1

这很好用并返回 AssemblyVersion 中提供的版本:

using System.Reflection;

infoFileVersionInfo versInfo = FileVersionInfo.GetVersionInfo("path.exe");
string version = $"v{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
于 2021-06-15T22:53:06.820 回答
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

于 2017-03-20T03:35:48.697 回答