如何从文件路径得到的.exe文件的版本号(How to get .exe file version

2019-06-26 01:58发布

我使用的.Net 3.5 / 4.0,在C#代码。

我试图让我的C一个exe文件的版本号:驱动器。

例如路径是:C:\程序\ DEMO.EXE。 如果DEMO.EXE的版本号为1.0。

我该如何使用这条道路抢版本号?

Answer 1:

您可以使用FileVersionInfo.ProductVersion从路径获取这一点。

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


Answer 2:

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

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

这里是一个更完整的答案。 为了让主文本不是太长我分裂它可能是“足够”的,很多人一短(ER)摘要。 你不一定看详细第二部分,所以请不TL;博士:-)

简短的摘要:

  1. 有每个文件的不同版本(集版本,文件版本,产品版本),但通常你将让他们都等于没得到“版本地狱”已经在文件级别(它会及早)。

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

  3. 为了实现这一点,只需注释掉文件版本在AssemblyInfo.cs文件如下。 这保证了三种可能的不同版本的一个文件都是一样的!

    [组件:的AssemblyVersion( “1.1.2”)]
    // [组件:的AssemblyFileVersion( “1.1.2”)]

  4. 例如,对于语义版本你想只得到3版本部分出的可能4:

具有自动生成每一个Visual Studio的生成计数是非常有用的。 不过这个版本计数并不总是有用的,告诉你的客户,内部还是外部。 因此,对于提的文件版本窗口,在标题对话,我会建议,只显示三个部分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。

细节:

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

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

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

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

特别是违约可能是令人困惑。 推荐SO链接了解详细信息: FileVersionInfo和集信息

EntryAssembly与ExecutingAssembly
为了充分考虑用于获取运行应用程序的每一个版本的情况下,在其他地方寻找更多的细节,比如这里: 。这是获得装配位置,GetAssembly()位置或GetExecutingAssembly()更好的位置
特别是,可以有混淆,如果应该使用EntryAssembly或ExecutingAssembly。 他们都有优点和注意事项。 如果你在同一个组件设置为.exe文件有以下代码不,例如在一个辅助组件,事情变得更加复杂。 通常你会使用EntryAssembly然后,得到的.exe的版本。
但是:在Visual Studio单元测试来测试程序在并行.exe项目,GetEntryAssembly()doesn't工作(我ENV:NUnit的,VS2017)。 但GetExecutingAssembly()至少,只在单元测试doesn't崩溃你得到的测试项目的程序集的版本。 精细足够me.There可能它们并不是那么简单的情况。
如果愿意,你可以省略声明为静态使得它真的可能得到几个不同的组件版本在一个程序中。

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资源管理器显示了。 我会建议最大限度地分化的ProductVersion和文件版本中最“以客户为可见的”文件(主要是应用程序的主.EXE)。 但它可能是当然的区分,为“主”的应用程序的每个文件,让他们都有他们这是由客户看到所有的“营销”的ProductVersion选择。 但经验表明,这是没有必要也便宜,试图太多同步技术的版本和销售版本。 混乱doesn't真的降低,成本增加。 因此,解决办法在第一部分中描述的在这里应该这样做居多。

历史:大会版本与文件版本:一个原因是有不同的版本也是一个.NET组件可最初由几个文件(模块) -理论上。 这不是使用Visual Studio和很少在别处使用。 这可能是一个历史原因给予区分这两个版本的可能性。 技术上,程序集版本是相关的.NET版本相关的GAC和侧端版本,文件版本是经典设置,如在更新或共享文件覆盖更相关。



Answer 3:

在接受答案的引用到“pathToExe”制造。

这个路径可以被检索和使用如下:

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

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



Answer 4:

Program是你的类名:

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


Answer 5:

我不知道如果这是你在找什么,但是:

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

它说

int i;

// Get the file version for the notepad.
FileVersionInfo.GetVersionInfo(Path.Combine(Environment.SystemDirectory, "notepad.exe"));

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);


Answer 6:

使用时,它的工作:

using System.Reflection;

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


Answer 7:

//Example your file version is 1.0.0.0
//Solution 1
Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
yourLabel.Text = fileVer.FileVersion
//Solution 2
//Get File Version Number
yourLabel.Text = Application.ProductVersion
//Both solution will get output 1.0.0.0


文章来源: How to get .exe file version number from file path