C# WindowsApiCodepack PropertySystem AccessViolationExceptio



使用 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的支持)。

相关内容

  • 没有找到相关文章

最新更新