LegalCopyRight 在 FileVersionInfo C# 中始终为空?
LegalCopyRight is always empty in FileVersionInfo C#?
我在 windows 中有一个 SFX(自解压可执行文件)文件(使用 7z
、WinRar
、....等压缩工具创建),其中包含以下详细信息:
我想在 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 应用程序中测试):
所以两个选项:
- 编译 exe,使其 FileVersion 不会最终为空。希望不传输此信息不是您的压缩工具的错。
- 向 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();
}
}
}
我在 windows 中有一个 SFX(自解压可执行文件)文件(使用 7z
、WinRar
、....等压缩工具创建),其中包含以下详细信息:
我想在 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 应用程序中测试):
所以两个选项:
- 编译 exe,使其 FileVersion 不会最终为空。希望不传输此信息不是您的压缩工具的错。
- 向 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();
}
}
}