【问题标题】:How to get .exe file version number from file path如何从文件路径获取.exe文件版本号
【发布时间】:2012-07-05 18:04:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c#-4.0 version fileversioninfo


    【解决方案1】:

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

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

    【讨论】:

    • ".ProductVersion" 不是“文件的版本号”。这应该与文件版本(“.FileVersion”)区分开来。请参阅我的扩展示例。此外,两个版本都可以由四个部分组成,通常你会得到这四个部分,所以“1.0.0”是非典型的,“1.0.0.0”是规范的。
    • 有时这行得通,有时其他没有……任何线索?
    • @gumuruh 因为 Windows 不要求在可执行文件中有版本
    【解决方案2】:

    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 and AssemblyInfo

    EntryAssembly 与 ExecutingAssembly
    为了充分考虑获取正在运行的应用程序版本的每种情况,请在其他地方搜索更多详细信息,例如这里: Which is better for getting assembly location , GetAssembly().Location or 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);
          ..
      }
    }
    

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

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

    【讨论】:

      【解决方案3】:

      在接受的答案中提到了“pathToExe”。

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

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

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

      【讨论】:

      • 只有当你想读取当前运行文件的版本号时才正确。在大多数情况下,您需要读取另一个文件的版本,例如在创建目录列表期间
      【解决方案4】:

      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);
        
        【解决方案6】:

        使用这个,它可以工作:

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

        【讨论】:

        • 有效! (为什么是负面的?)这个方法得到AssemblyVersion,上面的其他方法得到AssemblyFileVersion
        【解决方案7】:

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

        using System.Reflection;
        
        infoFileVersionInfo versInfo = FileVersionInfo.GetVersionInfo("path.exe");
        string version = $"v{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
        

        【讨论】:

          【解决方案8】:
          • 解决方案 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
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 2010-09-20
          • 1970-01-01
          相关资源
          最近更新 更多