- у меня есть приложение .NET8 WPF, требующее подключения к различным последовательным USB-устройствам. Устанавливается только в Windows.
- Хотел получить дескрипторы USB-устройств для получения дополнительной информации при подключении. Подобно USB Tree View, который был основан на USBView
- чтобы получить эти дескрипторы, я создал проект C++, который компилируется в DLL, а затем импортируется в отдельный проект .NET.< /li>
Чтобы это заработало, использовались следующие ресурсы: - SO-вопрос, ссылка на блог, моды для кода из блога
< li>Все это работает нормально, когда я собираю локально - Важно то, что код C++ использует ссылку на SetupApi.h
- Во время разработки я получил ошибку (0x8007007E) «Не удалось найти конкретный модуль», связанную с файлом SetupApi.h библиотека. Это привело к решению добавить комментарий прагмы или добавить библиотеку в компоновщик (я попробовал оба решения, и оба работают). Пример здесь
- Как только все эти проблемы с компоновкой/библиотекой были решены, пакет C++ был собран, создана DLL, импортирована в мою программу на C# .NET, и все заработало локально.
- Однако, когда я собрал наше программное обеспечение и развернул его на машине без среды разработки (т. е. с Visual Studio), я теперь получаю то же самое (0x8007007E) для того же файла SetupApi.h. Это означает, что на ПК не установлены необходимые библиотеки.
C++
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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:
[img]https://i.sstatic.net /F0he3RvV.png[/img]
Когда я удаляю этот пакет 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, и я не думаю, что это кроличья нора, которую стоит решать.
Если есть способ объединить DLL моего проекта C++ так, чтобы она была большой и включала все требования, это жизнеспособное решение. Но мне не удалось выяснить, как скомпилировать DLL проекта C++, чтобы объединить все воедино.
Если я смогу скопировать необходимые файлы *.h, *.lib или *.dll как " Встроенный ресурс» проекта, что является приемлемым.
Развертывание выполняется через развертывание UWP. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного вмешательства вручную.
Подробнее здесь: https://stackoverflow.com/questions/786 ... stallation