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

Nov*_*eMe 64 version c#-4.0 fileversioninfo

我使用.Net 3.5/4.0和C#中的代码.

我想在我的C:驱动器上获取exe文件的版本号.

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

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

Ree*_*sey 129

您可以使用FileVersionInfo.ProductVersion从路径中获取此内容.

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.ProductVersion; // Will typically return "1.0.0" in your case
Run Code Online (Sandbox Code Playgroud)

  • ".ProductVersion"不是"文件的版本号".这应该与文件版本(".FileVersion")区分开来.请参阅我的扩展示例.此外,两个版本可以由四部分组成,通常你会得到这四个部分,因此"1.0.0"是非典型的,"1.0.0.0"是规范的. (6认同)

Phi*_*ilm 29

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

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

这是一个更完整的答案.为了使主要文本不那么冗长,我将它分成一个简短的(呃)摘要,这可能对很多人来说是"足够的".你没有义务阅读详细的第二部分,所以请不要tl;博士:-)

简短的摘要:

  1. 每个文件都有不同的版本(汇编版本,文件版本,产品版本),但通常你会将它们全部等于在文件级别上没有得到"版本地狱"(它会提前到来).

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

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

    [assembly:AssemblyVersion("1.1.2.")]
    // [assembly:AssemblyFileVersion("1.1.2.
    ")]

  4. 例如,对于语义版本控制,您希望仅获得可能的4个版本部分:

为每个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}";
Run Code Online (Sandbox Code Playgroud)

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().位置
特别是,可以如果应该使用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);
      ..
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Sop*_*are 19

在接受的答案中,参考"pathToExe".

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

var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion
Run Code Online (Sandbox Code Playgroud)

希望这可以节省一些人做一些不必要的额外步骤.

  • 仅当您想要读取当前运行文件的版本号时,这才是正确的.在大多数情况下,您需要读取另一个文件的版本,例如在创建目录列表期间 (3认同)

小智 7

Program你的班级名称在哪里:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
Run Code Online (Sandbox Code Playgroud)


Dra*_*nen 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);
Run Code Online (Sandbox Code Playgroud)