C# FileVersionInfo.FileVersion是否返回ProductVersion?

C# FileVersionInfo.FileVersion是否返回ProductVersion?,c#,.net,getfileversion,C#,.net,Getfileversion,我正在尝试使用C#获取文件版本: 对于大多数文件来说,这很好,但是对于某些文件,我收到的结果与Windows文件资源管理器中显示的结果不同 请参见附图:windows中显示的文件版本为“0.0.0.0”,但我使用FileVersion属性获得的文件版本为“000.000.000.000” 我尝试过使用不同版本的.NET(2,3.5,4),它们给出了相同的结果 还有谁经历过这个问题 谢谢 狮子座 Windows资源管理器似乎正在剥离版本的前0部分 尝试使用文件版本001.001.001.001创建

我正在尝试使用C#获取文件版本:

对于大多数文件来说,这很好,但是对于某些文件,我收到的结果与Windows文件资源管理器中显示的结果不同

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

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

还有谁经历过这个问题

谢谢 狮子座


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

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

编辑:


Explorer将001.001.001.001返回为ProductVersion,但只有在未设置AssemblyInformationalVersion的情况下,才会将其返回为ProductVersion。

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

如果使用reflector并检查
FileVersionInfo
class,可以看到它们的加载方式不同:

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


Windows资源管理器映像中的列是什么?第一个“版本”列是什么?第二个是什么?第一个是文件版本。第二个是“产品版本”。在代码中,我得到的FileVersion属性与windows中“产品版本”中显示的属性相同。我已经用建议的版本创建了一个程序集。在Inded中,explorer将其显示为“1.1.1.1”,同时显示为文件版本和产品版本。问题是其他一些API正在剥离这些前导零,我在这些和文件版本之间进行的一些比较失败。虚拟-1。你的答案是错的。版本不是001.001。。。实际上是000.000.000.000。这是一个字符串,请看我的答案。@aliostad001只是一个示例,用于提供一个测试用例。FileVersionInfo.FileVersion也是一个字符串,它指的是在资源管理器中看到的文件版本(不是产品版本)。如果要复制资源管理器的行为,可以将其转换为基于整数的版本对象:新版本(“000.000.000.000”)。如果在WIN32中将它们定义为整数,为什么会将整数转换为带前导零的字符串?它应该已转换为字符串中int的表示形式。您说它是产品信息,而不是文件信息(在评论中您说产品信息是第二个),windows=“0.0.0.0”中的文件版本,windows=“000.000.000”中的产品版本。在.NET中,它们返回“000.000.000.000”。如果根据WIN32,文件版本由INT组成,那么在.NET中检索时,从何处获取尾随零?我希望.NET将其解析为字符串“0”,而不是“000”。
 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);