2016-07-21 2 views
0

Я пытался получить библиотеку C (DLL), которая работает с некоторым простым тестовым кодом на C#. До сих пор я мог просто импортировать и использовать простые функции. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не знаю, как получить сложный тип возвращаемого типа из этой импортированной функции.Как обрабатывать сложный тип возвращаемого типа из C DLL-файла в C#?

Вот две функции подписи:

C:

#define HID_API_EXPORT __declspec(dllexport) 
#define HID_API_CALL 

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

C#:

[DllImport("hidapi.dll")] 
public static extern hid_device_info hid_enumerate(ushort vendor_id, ushort product_id); 

А вот две Структуры:

C:

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; 
}; 

C#:

[StructLayout(LayoutKind.Sequential)] 
public struct hid_device_info 
{ 
    public IntPtr path; 
    public ushort vendorid; 
    public ushort productid; 
    public IntPtr serialnumber; 
    public ushort releasenumber; 
    public IntPtr manufacturer; 
    public IntPtr product; 
    public ushort usagepage; 
    public ushort usage; 
    public int interfacenumber; 

    public IntPtr next; 
} 

В настоящее время я получаю эту ошибку, когда я запускаю программу:

Управляемые DEBUGGING Помощник 'PInvokeStackImbalance' обнаружил проблемы в «C: \ Users \ tajensen \ Documents \ hidapiCS \ hidapitest \ Bin \ Debug \ hidapitest.vshost.exe.

Дополнительная информация: вызов функции PInvoke 'hidapiCS! HidapiCS.hidapi :: hid_enumerate' имеет несбалансированный стек. Это, скорее всего, потому, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре. Убедитесь, что соглашение о вызове и параметры сигнатуры PInvoke совпадают с целевой неуправляемой подписью .

Я сделал немного копать и единственное, что я смог найти описания, как получить типы возвращаемых очень простых структур (т.е. без каких-либо указателей, а только основные типы, такие как Интс и BOOLS). Я бы очень признателен за дополнительную информацию по этому вопросу, поскольку я знаю, где я хочу быть, но я не знаю достаточно о таком коде, чтобы копать глубже сам по себе.

Спасибо заранее, Toms

ответ

2

Ваша структура выглядит хорошо, обнажая флаги командной строки, которые меняют упаковку этого.

Скорее всего, это из-за этой линии

#define HID_API_CALL 

Это означает, что вы используете по умолчанию соглашение о вызовах в, которая, как правило __cdecl. Таким образом, изменение P/Invoke определения:

[DllImport("hidapi.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern hid_device_info hid_enumerate(ushort vendor_id, ushort product_id); 

Таким образом, правила о том, как управлять стеком на стороне C следует должным образом.

+0

Ну, это сработало для меня! Это было намного проще, чем я думал, ха-ха. –

1

Существует инструмент по имени SWIG, инструмент генерации кода, соединяет программы, написанные на C и C++ с различными языками программирования высокого уровня, как C#. Он генерирует код оболочки для двадцати трех разных целевых языков:

Это очень удобно для этих задач, особенно для преобразования типов данных/указателей и многих других. Это экономит ручное преобразование.

Попробуйте использовать этот инструмент для генерации кода C# для вашего случая и, наконец, скомпилированного Dll.

Загрузить двоичный код: http://prdownloads.sourceforge.net/swig/swigwin-3.0.10.zip.

Для урока: http://www.swig.org/tutorial.html

+0

Спасибо за ссылки, я определенно собираюсь проверить их. –

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

  • Нет связанных вопросов^_^