#cpp #c_sharp #linux
Здравствуйте! Сейчас пишу на Моно в Убунту приложение на С#, использующее библиотеку C. Есть сложности с синтаксисом вызова. Напимер, в библиотеке есть функция: nfc_device* nfc_open (nfc_context *context, const nfc_connstring connstring) где struct nfc_device { const nfc_context *context; const struct nfc_driver *driver; void *driver_data; void *chip_data; char name[DEVICE_NAME_LENGTH]; nfc_connstring connstring; bool bCrc; bool bPar; bool bEasyFraming; bool bInfiniteSelect; bool bAutoIso14443_4; uint8_t btSupportByte; int last_error; }; struct nfc_context { bool allow_autoscan; bool allow_intrusive_scan; uint32_t log_level; struct nfc_user_defined_device user_defined_devices[MAX_USER_DEFINED_DEVICES]; unsigned int user_defined_device_count; }; typedef char nfc_connstring[NFC_BUFSIZE_CONNSTRING]; Как эту функцию вызвать из С#? мой вариант, но я в его правильности не уверен: public class nfc_context { public bool allow_autoscan; public bool allow_intrusive_scan; public uint log_level; public nfc_user_defined_device[] user_defined_devices = new nfc_user_defined_device[MAX_USER_DEFINED_DEVICES]; public uint user_defined_device_count; }; public class nfc_device { public const nfc_context context = null; public const nfc_driver driver = null; public unsafe void *driver_data; public unsafe void *chip_data; public byte[] name = new byte[DEVICE_NAME_LENGTH]; public byte[] connstring = new byte[NFC_BUFSIZE_CONNSTRING]; public bool bCrc; public bool bPar; public bool bEasyFraming; public bool bInfiniteSelect; public bool bAutoIso14443_4; public byte btSupportByte; public int last_error; }; [DllImport ("libnfc.so", EntryPoint = "nfc_open")] unsafe public static extern nfc_device nfc_open (nfc_context context, byte[] connstring); Кто-то может подсказать что не правильно?
Ответы
Ответ 1
Работающий вариант: [StructLayout(LayoutKind.Sequential)] public struct nfc_connstring{ [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NFClibConst.NFC_BUFSIZE_CONNSTRING)] public byte[] vals; }; [StructLayout(LayoutKind.Sequential)] public struct nfc_context { public bool allow_autoscan; public bool allow_intrusive_scan; public uint log_level; [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NFClibConst.MAX_USER_DEFINED_DEVICES)] public nfc_user_defined_device[] user_defined_devices; public uint user_defined_device_count; }; [StructLayout(LayoutKind.Sequential)] public struct nfc_device { public IntPtr context; public IntPtr driver; public unsafe void *driver_data; public unsafe void *chip_data; [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NFClibConst.DEVICE_NAME_LENGTH)] public byte[] name; public nfc_connstring connstring; public bool bCrc; public bool bPar; public bool bEasyFraming; public bool bInfiniteSelect; public bool bAutoIso14443_4; public byte btSupportByte; public int last_error; }; [DllImport ("libnfc", EntryPoint = "nfc_open")] unsafe public static extern IntPtr nfc_open (nfc_context context, nfc_connstring connstring); И собственно вызов из кода: nfc_device pND = Marshal.PtrToStructure(NFClib.nfc_open (Context, connstrings [i])); использованы такие источники: https://msdn.microsoft.com/ru-ru/library/ac7ay120%28v=vs.110%29.aspx https://msdn.microsoft.com/ru-ru/library/eshywdt7%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-9
Комментариев нет:
Отправить комментарий