pragma comment
或将库添加到链接器的解决方案(我尝试了这两种解决方案并且都有效)。 示例在这里示例代码: C++
#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;
}
C#
[DllImport(_dllImportPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetUSBCount", CharSet = CharSet.Auto)]
public static extern int GetUSBCount();
我实现此功能的一种方法是在部署软件的 PC 上安装 Visual Studio。然而,这显然不是最终的解决方案,但让我知道有一种方法可以解决它。如果我使用以下软件包(没有其他软件包)安装 Visual Studio Community,则该软件运行时不会出现错误。
此软件包还安装以下 SDK: 当我卸载这个sdk包时,部署的软件找不到setupAPI.h。让我猜测随该软件包安装的某些内容包含查找 SetupApi 所需的链接。
dotnet add package Microsoft.Windows.SDK.CPP.arm --version 10.0.22621.3233
包含在适用的 .NET 项目中。这会导致 TargetPlatform 的版本问题,并且是一个我认为不值得解决的兔子洞。该软件并没有真正部署在很多地方,并且已经有一些针对其安装的其他方面的黑客解决方案。因此,如果我可以将文件夹复制到某处,并设置一些 hacky 链接来调用它,那也可以。最主要的是我显然无法在每台计算机上安装 Visual Studio。
如果有一种方法可以将我的 C++ 项目 DLL 捆绑得很大并包含所有要求,那么这就是一个可行的解决方案。但我一直没能弄清楚如何编译 C++ 项目 DLL 以将所有内容捆绑在一起。
如果我可以将所需的 *.h、*.lib 或 *.dll 文件复制为项目的“嵌入式资源”,这是可以接受的。
部署是通过 UWP 部署完成的。我们利用云构建脚本来实际构建和存储安装文件。但是,当我们设置一台新电脑时,我们需要许多驱动程序和自定义安装,才能使一切正常运行。自动化安装的需求并不那么重要,因为每个部署都需要适当的手动参与。
AhmedAEK 的评论带来了解决方案。 可以帮助其他遇到类似问题的人的主要问题是确保将 Visual Studio 中的 VC C++ 项目编译为“发布”模式,否则它们将无法工作。