Как получить USB C++ SetupApi.h на компьютере для установки приложения .NET для использования

История:

  • у вас есть приложение .NET8 WPF, требующее подключения к различным последовательным USB-устройствам. Устанавливается только в Windows.
  • Хотел получить дескрипторы устройств USB для получения дополнительной информации при подключении. Аналогично USB Tree View , основанному на USBView
  • чтобы получить эти дескрипторы, я создал проект C++, который компилируется в DLL, а затем импортируется в отдельный проект .NET.
  • Использовал следующие ресурсы, чтобы заставить это работать:
  • ТАК вопрос , Ссылка на блог , Моды для кода из блога
  • Все это отлично работает, когда я собираю локально
  • Важно то, что код C++ использует ссылку SetupApi.h.

Конкретные вопросы

  • во время разработки я получил ошибку (0x8007007E) «Не удалось найти конкретный модуль», связанную с библиотекой SetupApi.h. Это привело к решению добавить pragma comment или библиотеку в компоновщик (я попробовал оба решения, и оба работают). Пример здесь
  • Как только все эти проблемы с компоновкой/библиотекой были решены, пакет C++ был собран, создана DLL, импортирована в мою программу C# .NET, и все заработало локально.
  • Однако, когда я собрал наше программное обеспечение и развернул его на машине без среды разработки (т. е. с Visual Studio), я теперь получаю то же самое (0x8007007E) для того же SetupApi.h. Это значит, что на ПК не установлены нужные библиотеки.

Пример кода: С++

#include <iostream>
#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h >
#include <initguid.h>
#include <usbiodef.h>
#include <usbioctl.h>
#include <combaseapi.h>
#include <winioctl.h>
#include <regex>

int UsbQuery::getUSBCount() {
    //error is thrown from the below code
    HDEVINFO usbInfo = SetupDiGetClassDevs(&GUID_CLASS_USB_DEVICE, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); 

    SP_DEVINFO_DATA deviceData;
    deviceData.cbSize = sizeof(SP_DEVINFO_DATA);

    int i = 0;
    while (SetupDiEnumDeviceInfo(usbDeviceInfoSet, i, &deviceData))
    {
        i++;
    }
    return i;
}

С#

    [DllImport(_dllImportPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetUSBCount", CharSet = CharSet.Auto)]
    public static extern int GetUSBCount();

Что сработало

Единственный способ заставить это работать — установить Visual Studio на ПК, на котором развернуто программное обеспечение. Однако это, очевидно, не окончательное решение, но оно привело меня на путь осознания того, что есть способ исправить это. Если я установлю сообщество Visual Studio со следующим пакетом (и ничего больше), программное обеспечение заработает без ошибок.

Этот пакет также устанавливает следующий SDK: Когда я удаляю этот пакет SDK, развернутое программное обеспечение не может найти setupAPI.h. Это наводит меня на мысль, что что-то, установленное вместе с этим пакетом, включает в себя ссылку, необходимую для поиска SetupApi.

Что я пробовал

  • беру различные файлы «setupApi.dll» или «setupapi.lib», которые я могу найти на своем компьютере для разработчиков, напрямую включаю их в свое решение различными способами и копирую их на развернутый компьютер. Как я заметил, в папке System32 есть файлы с файлом «setupApi.dll». НЕ РАБОТАЕТ
  • установка многочисленных WindowSDK и WDK (без Visual Studio на компьютере) НЕ РАБОТАЕТ.
  • Находим SDK на изображении выше. Я не могу найти установщик для конкретного установщика .3233. Я предполагаю, что это означает, что это специфично для Visual Studio?
  • пытаюсь включить пакет dotnet add package Microsoft.Windows.SDK.CPP.arm --version 10.0.22621.3233 в соответствующий проект .NET. это вызывает проблемы с версией TargetPlatform, и я не думаю, что это кроличья нора, которую стоит решать.

Программное обеспечение на самом деле не развернуто во многих местах, и уже существуют некоторые хакерские решения для других аспектов его установки. Так что, если я могу скопировать куда-нибудь папку и установить какую-нибудь хакерскую ссылку для ее вызова, это тоже сработает. Главное, я явно не смогу установить Visual Studio на каждый компьютер. Если есть способ объединить DLL моего проекта C++ в большой размер и включить все требования, это жизнеспособное решение. Но мне не удалось выяснить, как скомпилировать DLL проекта C++, чтобы объединить все воедино.
Если я могу скопировать необходимые файлы *.h, *.lib или *.dll как «встроенный ресурс» проекта, это приемлемо.

Развертывание выполняется с помощью развертывания UWP. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного ручного вмешательства.

Вы серьезно на неправильном пути в этом вопросе. Setupapi.h ссылается только на библиотеки DLL операционной системы, доступные на любом компьютере с Windows. Гораздо более вероятно, что вашему модулю C++ нужна DLL. Найдите для него установщик здесь. Или разверните библиотеки DLL вместе с вашей программой. Или создайте модуль C++, чтобы они ему не требовались, что возможно в сценарии pinvoke. Проект > Свойства > C/C++ > Генерация кода > «Библиотека времени выполнения» = /MT. Дважды проверьте, запустив dumpbin.exe /imports в dll.

Hans Passant 19.06.2024 20:18

да, у меня также установлены все дистрибутивы vc C++ на ПК. Я думаю, вопрос в том, какой dll не хватает в ссылках setupapi, я знаю, что это более общий вопрос. Но я не знаю, какая DLL устанавливается через Visual Studio, которой нет. Я использую PInvoke для вызова своей DLL, но я не знаю, какую DLL вызывать, которая заключена в пример кода SetupDiGetClassDevs в вопросе.

Ginger Ninja 19.06.2024 20:41

Вы компилируете в режиме отладки или выпуска? Распространяемые файлы VС++ представляют собой только двоичные файлы.

Ahmed AEK 19.06.2024 21:26

Локально: отладка или выпуск. Для развернутого программного обеспечения — Release.

Ginger Ninja 19.06.2024 21:27

Загрузите средство обхода зависимостей или, если есть рука, современную версию и посмотрите, какая dll отсутствует на второй машине.

Ahmed AEK 19.06.2024 21:35

@AhmedAEK, ты ведешь меня по правильному пути, и я думаю, что я это исправил! В качестве временной меры я скомпилировал C++ dll локально и включил его в качестве встроенного ресурса. Наш сервер сборки необходимо переделать для работы с проектом C++. Однако я не обращал внимания и компилировал одноразовую версию в Debug, а затем передавал DLL в используемый проект. Итак, как многие из нас испытывают. Проблема заключалась в полной ошибке разработчика... Наверное, я также не знал, что установки VC C++ были только Release.

Ginger Ninja 19.06.2024 22:20

Рады узнать, что ваша проблема решена! Пожалуйста, рассмотрите возможность преобразования комментария в ответ.

Minxin Yu - MSFT 20.06.2024 07:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку комментарий АхмедАЕК привел к решению. Основная проблема, которая может помочь кому-либо еще с подобной проблемой, — это обязательно скомпилировать проекты VC C++ в Visual Studio в режиме «Выпуск», иначе они не будут работать.

Другие вопросы по теме

Невозможно опубликовать пустой 64-разрядный проект ASP.NET Web API 2 в Visual Studio 2022
Невозможно создать подписку на Microsoft Graph API с использованием самозаверяющего сертификата C# X509Certificate2
Укажите порт подключения к Azure Cosmos db (SQL)
Asp.net core 8 выбирает несколько с выбранным по умолчанию, не работает после обновления
Как настроить поведение взаимодействия из стиля
Первый подход к базе данных без использования файла EDMX
Невозможно опубликовать приложение Maui для Windows. Ошибка: «Файл манифеста obj\Release\net8.0\staticwebassets.build.json не найден»
Параллельные задачи. Запускайте параллельные потоки, но не ждите завершения других задач и получайте последние данные из базы данных
Ошибка «МАНИФЕСТ НЕИЗВЕСТНО» при публикации стандартного веб-приложения ASP.NET Core в приложениях-контейнерах Azure
Как сделать так, чтобы журналы отображались в командной строке при использовании команды dotnet run?