2015-03-27 3 views
0

Я пытаюсь подключить USB-драйвер только для Windows к Linux, переключившись с hid.dll и других материалов только на окна на кросс-платформу hidapi.Использование C структуры в C#

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 позднее дает мне указатель. Однако я не уверен, как исходить отсюда. Я хотел бы превратить это в LinkedList объектов hid_device_info или какую-либо другую структуру в C#.

Я новичок в C#, но у меня много опыта программирования. Не могли бы вы указать мне в правильном направлении?

+3

Это указатель к вам: http://stackoverflow.com/questions/16065110/porting-c-struct-to-c-sharp –

ответ

0

Вот что я в итоге сделал. Я сделал структуры в 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; 
     } 

Он хорошо работает.

Смежные вопросы