PortableDeviceManagerClass в C # не может инициализировать - PullRequest
0 голосов
/ 15 октября 2019

У меня есть библиотека ac #, которая предоставляет некоторые функциональные возможности для загрузки данных на подключенные (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 с Visual Studioи использовать это внутри приложения Delphi. Когда приложение Delphi вызывает функцию getDevices(), я получаю сообщение об ошибке при создании класса PortableDeviceCollection:

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

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

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

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

Обратите внимание. Я не написал ни библиотеку c #, ни приложение delphi. Оба работали вместе годами. Теперь я должен добавить functionallity в библиотеку c #. Я не добавил ни одного кода в проект. Я просто попытался скомпилировать его снова и использовать DLL. Единственное, что я сделал, это обновил RGiesecke.DLLExport.Metadata через NuGet Packetmanager. Без обновления я получил ошибку

"Microsoft.Build.Utilities.ToolLocationHelper не смог найти ildasm.exe"

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

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

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

1 Ответ

0 голосов
/ 16 октября 2019

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

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

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

...