使用 WindowsAPICodePack 在 Win8/64bit 上做一些资源管理器/shell 的东西。属性系统存在一些问题,导致在使用 x64 平台目标迭代文件属性时出现访问违规异常。似乎在PropVariant.cs中存在一些问题。切换到 x86 可以解决问题,但会导致目录列表不完整(例如 system32/drivers 中缺少"etc")。有什么想法吗?
using System;
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
namespace ApiCodepackTest
{
class Program
{
const string path = @"c:windowssystem32drivers";
static void Main(string[] args)
{
var shellObject = (ShellFolder)ShellObject.FromParsingName(path);
showProperties(shellObject);
showItems(shellObject);
Console.ReadLine();
}
static void showProperties(ShellFolder folder)
{
var sys = folder.Properties.System;
foreach (var prop in sys.GetType().GetProperties())
{
try
{
var shellProperty = prop.GetValue(sys) as IShellProperty;
if (shellProperty != null && shellProperty.ValueAsObject != null)
Console.WriteLine(shellProperty.CanonicalName + " " + shellProperty.ValueAsObject);
}
catch{} //you should not pass!
}
}
static void showItems(ShellFolder folder)
{
foreach (var i in folder)
Console.WriteLine(i.Name);
}
}
我并不是很喜欢pinvoke和c ++的东西,但是我已经在PropVariant中进行了一些修复,重新编译了源代码.cs :
//[FieldOffset(12)] original
[FieldOffset(16)]
IntPtr _ptr2;
这解决了问题
对于发现此问题的其他任何人,您现在可以避免重新编译源代码以实现此错误修复。
正如本回答中所讨论的,开源的WindowsAPICodePack现在由不同的开发人员(Pierre Sprimont)维护。 它最近于 2022 年 7 月进行了更新,可在 GitHub 上获得,也可以直接通过 Visual Studio 作为一系列 Nuget 包获得。 开发人员的网站讨论他的项目分支在这里,其中包含指向每个Github存储库和Nuget页面的链接。
PropVariant中的AccessViolationException错误.cs@Aleksey接受的答案中讨论的已经得到修复,以及许多其他错误修复和改进(包括对.NET Core的支持)。