FileVersionInfo.FileVersion返回ProductVersion?

我试图使用C#获取文件版本:

string file = @"C:\somefile.dll"; Console.WriteLine(FileVersionInfo.GetVersionInfo(file).FileVersion); 

对于大多数文件,这很好,但是对于某些我收到的结果与Windows文件浏览器中显示的结果不同。

请参见附图:windows中显示的文件版本为“0.0.0.0”,但我使用FileVersion属性的文件版本为“000.000.000.000”。

我尝试使用不同版本的.NET(2,3.5,4),它们给出了相同的结果。

其他人遇到过这个问题?

谢谢Lior

在此处输入图像描述

似乎Windows资源管理器正在剥离版本部分的前导0。

尝试使用FileVersion 001.001.001.001创建程序集,它将在资源管理器中显示为1.1.1.1。 但是您的代码将返回实际值(001.001.001.001)。

编辑:

Explorer将返回001.001.001.001作为ProductVersion ,但仅当未设置AssemblyInformationalVersion时 ,在这种情况下它将返回ProductVersion。

原因是,在WIN32 API(和文件元数据)中,产品版本定义为字符串,但文件版本定义为整数,而在.NET中,所有版本都定义为整数。

如果使用reflection器并检查FileVersionInfo类,则可以看到它们的加载方式不同:

  this.productVersion = GetFileVersionString(memIntPtr, string.Format(CultureInfo.InvariantCulture, format, new object[] { codepage, "ProductVersion" })) 

但:

 this.fileMajor = HIWORD(fixedFileInfo.dwFileVersionMS); this.fileMinor = LOWORD(fixedFileInfo.dwFileVersionMS); this.fileBuild = HIWORD(fixedFileInfo.dwFileVersionLS); this.filePrivate = LOWORD(fixedFileInfo.dwFileVersionLS);