у меня есть приложение .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. Это означает, что на ПК не установлены необходимые библиотеки.
[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, и я не думаю, что это кроличья нора, которую стоит решать.
Программное обеспечение на самом деле не развернуто во многих местах, и уже есть несколько хакерских решений для других аспектов его установки. Так что, если я могу скопировать куда-нибудь папку и установить какую-нибудь хакерскую ссылку для ее вызова, это тоже сработает. Главное, что я, очевидно, не могу установить Visual Studio на каждый компьютер.
Если есть способ объединить DLL моего проекта C++ так, чтобы она была большой и включала все требования, это жизнеспособное решение. Но мне не удалось выяснить, как скомпилировать DLL проекта C++, чтобы объединить все воедино.
Если я смогу скопировать необходимые файлы *.h, *.lib или *.dll как " Встроенный ресурс» проекта, что является приемлемым.
Развертывание выполняется через развертывание UWP. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного вмешательства вручную.
История: [list] [*]у меня есть приложение .NET8 WPF, требующее подключения к различным последовательным USB-устройствам. Устанавливается только в Windows. [*]Хотел получить дескрипторы USB-устройств для получения дополнительной информации при подключении. Подобно USB Tree View, который был основан на USBView [*]чтобы получить эти дескрипторы, я создал проект C++, который компилируется в DLL, а затем импортируется в отдельный проект .NET.< /li> Чтобы это заработало, использовались следующие ресурсы: [*]SO-вопрос, ссылка на блог, моды для кода из блога < li>Все это работает нормально, когда я собираю локально [*]Важно то, что код C++ использует ссылку на SetupApi.h [/list] Конкретные проблемы [list] [*]Во время разработки я получил ошибку (0x8007007E) «Не удалось найти конкретный модуль», связанную с файлом SetupApi.h библиотека. Это привело к решению добавить комментарий прагмы или добавить библиотеку в компоновщик (я попробовал оба решения, и оба работают). Пример здесь [*]Как только все эти проблемы с компоновкой/библиотекой были решены, пакет C++ был собран, создана DLL, импортирована в мою программу на C# .NET, и все заработало локально.[*]Однако, когда я собрал наше программное обеспечение и развернул его на машине без среды разработки (т. е. с Visual Studio), я теперь получаю то же самое (0x8007007E) для того же файла SetupApi.h. Это означает, что на ПК не установлены необходимые библиотеки. [/list] Пример кода: C++ [code]#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));
int i = 0; while (SetupDiEnumDeviceInfo(usbDeviceInfoSet, i, &deviceData)) { i++; } return i; } [/code] C# [code] [DllImport(_dllImportPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetUSBCount", CharSet = CharSet.Auto)] public static extern int GetUSBCount(); [/code] Что сработало Единственный способ заставить это работать — установить Visual Studio на ПК, на котором развернуто программное обеспечение. Однако это, очевидно, не окончательное решение, но оно привело меня на путь осознания того, что есть способ исправить это. Если я устанавливаю сообщество Visual Studio со следующим пакетом (и ничем другим), программное обеспечение работает без ошибок. [img]https://i.sstatic.net/KPFmi4LG .png[/img]
Этот пакет также устанавливает следующий SDK: [img]https://i.sstatic.net /F0he3RvV.png[/img] Когда я удаляю этот пакет SDK, развернутое программное обеспечение не может найти файл setupAPI.h. Это заставляет меня предположить, что что-то, установленное вместе с этим пакетом, содержит ссылку, необходимую для поиска SetupApi. Что я пробовал [list] [*] беру различные файлы «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, и я не думаю, что это кроличья нора, которую стоит решать. [/list] Программное обеспечение на самом деле не развернуто во многих местах, и уже есть несколько хакерских решений для других аспектов его установки. Так что, если я могу скопировать куда-нибудь папку и установить какую-нибудь хакерскую ссылку для ее вызова, это тоже сработает. Главное, что я, очевидно, не могу установить Visual Studio на каждый компьютер. Если есть способ объединить DLL моего проекта C++ так, чтобы она была большой и включала все требования, это жизнеспособное решение. Но мне не удалось выяснить, как скомпилировать DLL проекта C++, чтобы объединить все воедино.
Если я смогу скопировать необходимые файлы *.h, *.lib или *.dll как " Встроенный ресурс» проекта, что является приемлемым. Развертывание выполняется через развертывание UWP. Мы используем сценарий облачной сборки для создания и хранения установочных файлов. Но когда мы настраиваем новый компьютер, нам нужно множество драйверов и выборочных установок, чтобы все работало. Необходимость автоматической установки не так уж важна, поскольку каждое развертывание уже требует приличного вмешательства вручную.