在FileVersionInfo C#中,LegalCopyRight始终为空?

时间:2017-01-17 07:05:59

标签: c# fileversioninfo

我在Windows中有一个SFX(自解压可执行文件)文件(使用7zWinRar等....等拉链工具创建),其中包含以下详细信息:

File Details

我想在C#中获取CopyRight文本,所以我编写了以下代码:

var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath);
Console.Write(fileVersionInfo.LegalCopyright)

fileVersionInfo.LegalCopyright永远是空的! 有什么问题?

编辑:
我的原始代码:

var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath1);
var properties = typeof(FileVersionInfo).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var propertyInfo in properties)
{
    var value = propertyInfo.GetValue(fileVersionInfo);
    Console.WriteLine("{0} = {1}", propertyInfo.Name, value);
}
Console.ReadKey();

结果:

File Details

3 个答案:

答案 0 :(得分:5)

(我的声誉太低,无法发表评论,所以我在这里发布)

我刚刚测试了以下代码,它对我来说很正常。

var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Users\usr\Desktop\Game\steamIntegration\steam_api.dll");
Console.Write(fileVersionInfo.LegalCopyright);
Console.ReadLine();

也许您的权限不足以支持该文件。在项目中添加* .manifest,将requestedExecutionLevel更改为:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

也许这可以解决你的问题。

答案 1 :(得分:1)

您观察到的行为是由于Microsoft.NET框架类GetVersionInfoForCodePage的第411行中的私有函数FileVersionInfo的实现存在缺陷,目前版本为4.6.2且很可能更早一点:

// fileVersion is chosen based on best guess. Other fields can be used if appropriate. 
return (fileVersion != string.Empty);

来自参考源的引用(评论他们的意思)意味着如果其fileVersion成员为空(该块的成员,而不是标题中的成员),该函数将放弃另外正确猜测的特定于代码页的版本信息,这增加了混乱)。

您的exe文件就是这种情况:

version info as ResHacker shows it

当我们修改框架以使用它时......

return (productVersion != string.Empty);

...它按预期工作(在控制台和Windows应用程序中都经过测试):

output from patched version

所以有两个选择:

  1. 编译exe以使其FileVersion不会变空。希望压缩工具不是传输此信息的错误。
  2. 向Microsoft提交错误。我从他们的参考源许可证中收集到的内容,不允许在任何产品中包含衍生作品。

答案 2 :(得分:1)

最后我找到了解决方案:
1。首先安装以下软件包:

# example data:
dat <- data.frame(row=seq_len(10000),id=seq_len(10000))
# sample away!
dat[sample(seq_len(nrow(dat)), c(nrow(dat),1.5e4,2e4)[cut(nrow(dat), c(0,1e4,5e4,Inf))]),]

它有一个依赖包,Nuget自动安装Microsoft.WindowsAPICodePack.Shell

2. 现在我们可以获取文件属性,如下面的代码

Microsoft.WindowsAPICodePack.Core