【问题标题】:FileVersionInfo retrieving incorrect file versionFileVersionInfo 检索到不正确的文件版本
【发布时间】:2012-07-16 05:52:37
【问题描述】:

我必须通过 C# 检索详细信息选项卡下的值,例如文件版本、.dll 和 .exe 文件的产品版本。为此,我正在使用以下代码。

     FileVersionInfo myFile = FileVersionInfo.GetVersionInfo('Name of the file');
     //File Version
     string fileVersion = myFile.FileVersion;

此代码的问题是它为某些文件提供了不正确的文件版本。这些文件的详细信息选项卡显示不同的文件版本和代码检索不正确的值。我不确定为什么会这样。

请帮忙。提前致谢!!

【问题讨论】:

  • 你能举个具体的例子吗?预期的版本是什么(来自 Explorer),你得到的是什么?
  • 我发现计算机很少撒谎 :) --- 确保您查看的文件和值与您的代码正在检索的相同。
  • 预期版本(来自资源管理器)是 10.0.0.35,我得到了 10.0.000.0035,我检查了很多次。对于同一个文件,这个问题发生了

标签: c# .net dll


【解决方案1】:

预期版本(来自资源管理器)是 10.0.0.35,我得到了 10.0.000.0035

这是同一个数字。文件版本号出现在本机资源中两次。当您在 C++ 程序中编辑版本资源时,您也可以看到一些内容。有一个人类可读的版本,对格式没有限制。这就是您正在阅读的内容,请注意 FileVersionInfo.FileVersion 如何返回 string

还有一个机器可读的版本,一个 64 位数字。 4 个部分各有 16 位。这就是 Explorer 正在阅读的内容。对应的属性是 FileMajorPart、FileMinorPart、FileBuildPart 和 FilePrivatePart。注意它们如何返回一个 int

ProductVersion 也有这个。

【讨论】:

  • 所以要查看两个是否相等,一个应该说var fileVersionSeq = fileVersion.Split('.').Select(ushort.Parse);,然后使用SequenceEqual 来检查所有组件是否与另一个序列一致?
  • 为什么不直接使用 int 属性而不是尝试解析它呢?解析可能会失败。
  • 好主意。然后,另辟蹊径:string versionStringWithoutLeadingZeros = string.Join(".", myFile.FileMajorPart, myFile.FileMinorPart, myFile.FileBuildPart, myFile.FilePrivatePart);
【解决方案2】:

您可以通过以下方法获得完整的应用程序文件版本

FileVersionInfo myFile = FileVersionInfo.GetVersionInfo('Name of the file');
string fileVersion = string.Format("{0}.{1}.{2}.{3}", myFile.FileMajorPart, 
                                                      myFile.FileMinorPart, 
                                                      myFile.FileBuildPart, 
                                                      myFile.FilePrivatePart)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2018-07-22
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多