Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Вызов библиотечной функции С или CPP из приложения C#

#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

Комментариев нет:

Отправить комментарий