LegalCopyRight 在 FileVersionInfo C# 中始终为空?

LegalCopyRight is always empty in FileVersionInfo C#?

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

我想在 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();

结果:

(我的声望太低了,所以我post在这里发表评论)

我刚刚测试了下面的代码,它对我来说工作正常。

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" />

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

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

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

This citation from reference source (comment theirs) 意味着函数将放弃正确猜测的 codepage-specific 版本信息,如果它的 fileVersion 成员是空的(块的那个,不是在 header 中,这增加了混乱)。

你的exe文件是这样的:

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

return (productVersion != string.Empty);

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

所以两个选项:

  1. 编译 exe,使其 FileVersion 不会最终为空。希望不传输此信息不是您的压缩工具的错。
  2. 向 Microsoft 提交错误。我从他们的参考源许可证中了解到,它不允许在任何产品中包含派生作品。

终于找到解决办法了:
1.首先安装以下包:

Microsoft.WindowsAPICodePack.Shell

有依赖包,Nuget自动安装Microsoft.WindowsAPICodePack.Core

2. 现在我们可以通过如下代码获取文件属性

using System;
using System.Reflection;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            const string filePath1 = @"C:\Users\Mohammad\Downloads\Test\.....exe";
            var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellObject.FromParsingName(filePath1);
            foreach (var propertyInfo in typeof(ShellProperties.PropertySystem).GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                var shellProperty = propertyInfo.GetValue(shellFile.Properties.System, null) as IShellProperty;
                if (shellProperty?.ValueAsObject == null) continue;
                var shellPropertyValues = shellProperty.ValueAsObject as object[];
                if (shellPropertyValues != null && shellPropertyValues.Length > 0)
                {
                    foreach (var shellPropertyValue in shellPropertyValues)
                        Console.WriteLine("{0} = {1}", propertyInfo.Name, shellPropertyValue);
                }
                else
                    Console.WriteLine("{0} = {1}", propertyInfo.Name, shellProperty.ValueAsObject);
            }
            Console.ReadKey();
        }
    }
}