WPD/MTP 便携式设备,内容始终为空(Windows,Visual Studio 2012,VB.NET)

WPD/MTP PortableDevices, Content is always empty (Windows, VisualStudio 2012, VB.NET)

问题已使用 NuGet 包 PortableDevices 进行测试,解决方案来自此处:Accessing an MTP device in Visual Basic .NET

我想从三星 Android 平板电脑获取文件列表。我可以连接,但 GetContents() returns 没有文件 (root.Files.Count = 0)。提前致谢。

Dim Devices As New PortableDeviceCollection()
Devices.Refresh()
Dim tablet As PortableDevice
tablet = Devices.First()
tablet.Connect()
Dim root = tablet.GetContents()

对我来说,问题就解决了。先解释一下效果:在我的windows10设备管理器的便携设备列表中,有4个设备来自一张卡Reader,三星平板插在位置2。Interop.PortableDeviceApiLib.dll无法检索更多此处描述的设备:Enumerating Windows Portable Devices in C# 对于这个问题,GetDevices() returns 永远只有一个设备,在我的例子中是来自 Card Reader 的最后一个没有文件的设备。当连接更多设备(另一部智能手机)时,它成为最后一个设备并且代码(Windows 便携式 Devices.zip 来自 Accessing an MTP device in Visual Basic .NET)工作正常。

解决方案:我按照接受的答案 (Enumerating Windows Portable Devices in C#) 中的解释修复了互操作程序集中的编组问题,并将新的互操作 dll 复制到所有现有 Interop.PortableDeviceApiLib.dll 上(将嵌入互操作类型设置为参考文献中错误)。 PortableDeviceCollection.cs 中的代码(压缩包来自这里:Accessing an MTP device in Visual Basic .NET)我已更改如下:

public void Refresh()
{
    this._deviceManager.RefreshDeviceList();

    // Determine how many WPD devices are connected
    // new, according to https://docs.microsoft.com/en-us/windows/win32/wpd_sdk/enumerating-devices
    uint count = 1;
    string[] s = null;
    this._deviceManager.GetDevices(s, ref count);


    // Retrieve the device id for each connected device
    var deviceIds = new string[count];
    // old: this._deviceManager.GetDevices(ref deviceIds[0], ref count);
    this._deviceManager.GetDevices(deviceIds, ref count);
    foreach(var deviceId in deviceIds)
    {
        Add(new PortableDevice(deviceId));
    }
}

不幸的是,Interop.PortableDeviceApiLib.dlls 必须在 Visual Studio 中的每次清理后替换为新创建的 dll。编辑:在文章中 Andrew Trevarrow,Fun with MTP in C# (http://andrewt.com/2013/06/15/fun-with-mtp-in-c.html),是一个防止这个问题的提示:完成后,从 C# 项目 "PortableDevices" 中删除对 PortableDeviceApiLib 类型库的引用并添加对新的引用Interop.PortableDeviceApiLib.dll(在单独的文件夹中)并将 dll 的 "Embed Interop Types" 更改为 False。