在C#中使用C结构

Using a C struct in C#

本文关键字:结构      更新时间:2023-10-16

我正试图通过从hid.dll和其他仅限windows的东西切换到跨平台的hidapi,将仅限windows系统的USB驱动程序移植到Linux。

hidapi.h包含以下定义:

struct hid_device_info {
    char *path;
    unsigned short vendor_id;
    unsigned short product_id;
    wchar_t *serial_number;
    unsigned short release_number;
    wchar_t *manufacturer_string;
    wchar_t *product_string;
    unsigned short usage_page;
    unsigned short usage;
    int interface_number;
    struct hid_device_info *next;
};

struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);

请参阅上面的链接以获取带有注释的代码。

驱动程序是用C#编写的,所以我想连接到hidapi库并直接使用它们。我通过以下操作成功访问了hid_enumerate:

[DllImport ("/usr/local/lib/libhidapi-hidraw.so.0")]
internal static extern IntPtr hid_enumerate (ushort vendor_id, ushort product_id);

稍后调用hid_enumerate会给我一个指针。然而,我不确定如何从这里开始。我想把它变成hid_device_info对象的LinkedList,或者C#中的其他结构。

我对C#很陌生,但有很多编程经验。你能告诉我正确的方向吗?

以下是我最终所做的。我在C#中做了一个结构,如下所示:

    [StructLayout(LayoutKind.Sequential)]
    private struct hid_device_info {
        [MarshalAs(UnmanagedType.LPStr)]
        public String path;
        public ushort vendor_id;
        public ushort product_id;
        [MarshalAs(UnmanagedType.LPWStr)]
        public String serial_number;
        public ushort release_number;
        [MarshalAs(UnmanagedType.LPWStr)]
        public String manufacturer_string;
        [MarshalAs(UnmanagedType.LPWStr)]
        public String product_string;
        public ushort usage_page;
        public ushort usage;
        public int interface_number;
        public IntPtr next;
    };

当调用hid_enumerate时,我这样做是为了将指针变成结构的实例:

        List<hid_device_info> list = new List<HidDeviceManager.hid_device_info> ();
        IntPtr pDev = hid_enumerate (0, 0);
        while (pDev != IntPtr.Zero) {
            hid_device_info dev = new hid_device_info();
            dev = (hid_device_info)Marshal.PtrToStructure (pDev, typeof(hid_device_info));
            list.Add (dev);
            pDev = dev.next;
        }

它运行良好。