我正在尝试将 C++ 库移植到 .NET,但我无法让它工作,而且我不明白出了什么问题。我看到的唯一重大变化是,在带有 libusb 的 C++ 库中,我必须将 alt 接口设置设置为 1,但在 LibUsbDotNet 中,这在 Windows 上是不可能的,因为 WinUsbDevice 没有任何用于 alt 接口的设置器,只有一个吸气剂(它报告它是 0,与 libusb 不同)。
这是一个最小的代码,这在 interruptEndpointWriter.Write 上失败,返回 Win32Error:
foreach (UsbRegistry usbRegistry in UsbDevice.AllDevices)
{
if (usbRegistry.Pid == HELIOS_PID && usbRegistry.Vid == HELIOS_VID)
{
if (usbRegistry.Open(out UsbDevice dac))
{
IUsbDevice libUsbDevice = dac as IUsbDevice;
if (libUsbDevice != null)
{
// (This code doesn't run because WinUsb devices do not implement these this interface, even though it's possible with C++ libusb)
libUsbDevice.ClaimInterface(0);
libUsbDevice.SetAltInterface(1);
}
using (var interruptEndpointWriter = dac.OpenEndpointWriter(WriteEndpointID.Ep06, EndpointType.Interrupt))
{
var errorCode = interruptEndpointWriter.Write(new byte[] { 0x03, 0 }, 16, out int writeTransferLength);
if (errorCode == ErrorCode.Ok && writeTransferLength == 2)
{
Console.WriteLine("OK");
}
}
}
}
}
这是原始的c ++代码。这工作正常。
int result = libusb_init(NULL);
libusb_device** devs;
ssize_t cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0)
return (int)cnt;
for (int i = 0; i < cnt; i++)
{
struct libusb_device_descriptor devDesc;
int result = libusb_get_device_descriptor(devs[i], &devDesc);
if (result < 0)
continue;
if ((devDesc.idProduct != HELIOS_PID) || (devDesc.idVendor != HELIOS_VID))
continue;
libusb_device_handle* devHandle;
result = libusb_open(devs[i], &devHandle);
if (result < 0)
continue;
result = libusb_claim_interface(devHandle, 0);
if (result < 0)
continue;
result = libusb_set_interface_alt_setting(devHandle, 0, 1);
if (result < 0)
continue;
int actualLength = 0;
std::uint8_t ctrlBuffer[2] = { 0x03, 0 };
int transferResult = libusb_interrupt_transfer(devHandle, 0x06, ctrlBuffer, 2, &actualLength, 16);
if (transferResult == LIBUSB_SUCCESS)
{
// ok
}
}
我究竟做错了什么?