我正在尝试使用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),它们会产生相同的结果。
其他人遇到过这个问题吗?
由于 利奥尔
答案 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);