#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
Комментариев нет:
Отправить комментарий