FileVersionInfo.FileVersion返回ProductVersion?

时间:2011-03-28 14:09:31

标签: c# .net getfileversion

我正在尝试使用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),它们会产生相同的结果。

其他人遇到过这个问题吗?

由于 利奥尔

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

编辑:

资源管理器将返回001.001.001.001作为 ProductVersion ,但仅当未设置 AssemblyInformationalVersion 时,在这种情况下,它会将其作为ProductVersion返回。

答案 1 :(得分:1)

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

如果您使用反射器并检查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);