WPD/MTP PortableDevices, содержимое всегда пусто (Windows, VisualStudio 2012, VB.NET)

Проблема проверена с помощью пакета NuGet PortableDevices и решения отсюда: >Доступ к устройству MTP в Visual Basic .NET

Я хочу получить список файлов с планшета Samsung Android. Я могу подключиться, но GetContents() не возвращает файлы (root.Files.Count = 0). Заранее спасибо.

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

person Cor    schedule 28.12.2019    source источник


Ответы (1)


Для меня проблема решена. Во-первых, позвольте мне объяснить эффект: в списке портативных устройств в моем диспетчере устройств Windows 10 есть 4 устройства из устройства чтения карт памяти и планшет Samsung, вставленный в позицию 2. У Interop.PortableDeviceApiLib.dll была проблема, чтобы получить больше одного устройство, описанное здесь: Перечисление переносных устройств Windows в C#. С этой проблемой GetDevices() возвращает только одно устройство, в моем случае последнее устройство из Card Reader без файлов. При подключении еще одного устройства (другого смартфона) оно становится последним устройством и кодом (Windows Portable Devices.zip из Доступ к устройству MTP в Visual Basic .NET) работает нормально.

Решение: я исправляю проблему сортировки в сборке взаимодействия, как описано в принятом ответе (Перечисление переносных устройств Windows в C#) и скопируйте новую DLL Interop поверх всех существующих Interop.PortableDeviceApiLib.dll (установите для Embed Interop Types значение False в ссылках). Код в PortableDeviceCollection.cs (zip-пакет отсюда: Доступ к устройству MTP в 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.dll необходимо заменить новой созданной dll после каждой очистки в Visual Studio. Изменить: в статье Эндрю Треварроу Fun with MTP in C# (http://andrewt.com/2013/06/15/fun-with-mtp-in-c.html), является подсказкой для предотвращения этой проблемы: когда все сделано, удалите ссылку на Библиотека типов PortableDeviceApiLib из проекта C# "PortableDevices" и добавьте ссылку на новую Interop.PortableDeviceApiLib.dll (в отдельной папке) и измените "Embed Interop Types" для dll на False.

person Cor    schedule 31.12.2019