PortableDeviceManagerClass в С# не может инициализироваться

У меня есть библиотека С#, которая предоставляет некоторые функциональные возможности для загрузки данных на подключенные устройства (Android). Сама dll экспортируется через UnmangedExports для использования приложением Delphi.

Вот функция, которая вызывается приложением delphi:

[DllExport]
[return: MarshalAs(UnmanagedType.LPStr)]
public static string getDevices()
{
    try
    {
        var devices = string.Empty;
        var collection = new PortableDeviceCollection();
        collection.Refresh();

        foreach (var device in collection)
        {
            device.Connect();
            if (devices != string.Empty)
            {
                devices += ";";
            }
            devices += device.FriendlyName;
            device.Disconnect();
        }
        return devices;
    }
    catch (Exception e)
    {
        SomeClass.WriteErrorToLogFile(e);
        return "ERROR";
    }
}

Вот класс PortableDeviceCollection:

public class PortableDeviceCollection : Collection<PortableDevice>
{
    private readonly PortableDeviceApiLib.PortableDeviceManagerClass _deviceManager;

    public  PortableDeviceCollection()
    {
        this._deviceManager = new PortableDeviceApiLib.PortableDeviceManagerClass();
    }

    public bool Refresh()
    {
        this._deviceManager.RefreshDeviceList();
        // Determine how many WPD devices are connected
        var deviceIds = new string[1];
        uint count = 1;
        this._deviceManager.GetDevices(null, ref count);
        if (count > 0)
        {
            // Retrieve the device id for each connected device
            deviceIds = new string[count];
            this._deviceManager.GetDevices(deviceIds, ref count);
            foreach (var deviceId in deviceIds)
            {
                Add(new PortableDevice(deviceId));
            }
            return true;
        }
        else
            return false;
    }
}

Я могу создать dll с визуальной студией и использовать ее внутри приложения Delphi. Когда приложение delphi вызывает функцию getDevices(), я получаю сообщение об ошибке при создании экземпляра класса PortableDeviceCollection:

Файл или сборка «Interop.PortableDeviceApiLib, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или зависимость от нее не найдены. Сборка создается средой выполнения, которая является более поздней, чем загруженная в данный момент среда выполнения, и не может быть загружена.

ProductXY.PortableDeviceCollection..ctor()
ProductXY.ProductXYMain.getDevices()

В качестве целевой платформы для проекта С# установлено значение .Net Framework 4. Используя любую более низкую версию, я получаю сообщение об ошибке при попытке скомпилировать проект:

Первичная ссылка «Interop.PortableDeviceApiLib» не может быть разрешена, поскольку она косвенно зависит от сборки .NET Framework «mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089», которая является более высокой версией 4.0.0.0. чем версия 2.0.0.0 в текущей целевой структуре.

Пожалуйста, обрати внимание. Я не писал ни библиотеку С#, ни приложение Delphi. Оба работали вместе в течение многих лет. Теперь мне нужно добавить функциональность в библиотеку С#. Я не добавлял код в проект. Я просто попытался скомпилировать его снова и использовать dll. Единственное, что я сделал, это обновил RGiesecke.DLLExport.Metadata через NuGet Packetmanager. Без обновления я получил ошибку

«Microsoft.Build.Utilities.ToolLocationHelper не удалось найти ildasm.exe»

Мне известно об этом перечислении портативных устройств Windows в C#. Но моя ошибка возникает до того, как будет достигнут код, на который распространяется вопрос. Я еще попробовал решение вопроса, но действие (разобрать, найти и заменить в dll), которое описано в ответе, уже сделано (иначе мой код не скомпилировался бы).

Сообщение об ошибке не имеет для меня смысла. Interop.PortableDeviceApiLib — это COM-Lib, которая недоступна для загрузки в различных версиях фреймворка. Я думаю, что я что-то упускаю здесь.

Может кто-нибудь помочь мне?


person Olli    schedule 15.10.2019    source источник


Ответы (1)


Наконец-то я смог решить эту проблему. Честно говоря, я не знаю, что, наконец, решило это. Для каждого, кто наткнется на это, вот что я пытался решить эту проблему. Они не в определенном порядке (поскольку я пробовал все несколько раз):

  • Обновление пакета RGiesecke.DLLExport
  • Смена платформы в Диспетчере конфигураций на x86
  • Разберите, отредактируйте и повторите анализ Interop.PortableDeviceApiLib, как в этом вопросе (ответы Кристоф Джирс и Бруно Кляйн)
  • Удалить ссылку на Interop.PortableDeviceApiLib
  • Удалить ссылку на Interop.PortableDeviceTypesLib
  • Чтение ссылки на Interop.PortableDeviceApiLib
  • Чтение ссылки на Interop.PortableDeviceTypesLib
  • Перестроить проект
  • Установка вставки Interoptyp для обоих на false (я нашел различные утверждения, НЕ делающие этого, но проект был настроен так, когда я его получил, и он работал (будьте осторожны)) на обеих Interop-Libs.

По крайней мере мне это помогло.

person Olli    schedule 16.10.2019