0

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

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

谢谢里奥

在此处输入图像描述

4

2 回答 2

1

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

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

编辑:

Explorer 将返回 001.001.001.001 作为ProductVersion,但前提是未设置AssemblyInformationalVersion,在这种情况下它会将其作为 ProductVersion 返回。

于 2011-03-28T14:24:12.027 回答
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);
于 2011-03-28T14:30:05.173 回答