Как правильно обернуть родную библиотеку c в Xamarin.iOS

Я пытаюсь привязать собственную библиотеку c (не объект c) к Xamarin.iOS.

Мой проект, состоящий из файлов .c и .h, отлично работает в XCode. Фактические .h и .m проекта не содержат никаких функций, мне нужно использовать только c-определенные процедуры.

Файл h, содержащий определение необходимого метода, выглядит так:

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int sprec_flac_encode(const char *wavfile, const char *flacfile);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* !__SPREC_FLAC_ENCODER_H__ */

Я встроил его в толстый двоичный файл, но спецификация в документации Xamarin неясна. Учитывая, что я привязываю собственную библиотеку, мне нужен проект привязки в моем решении. В любом случае мне нужен вызов оболочки, чтобы поместить в нее определения DLLImport? Где документируется этот процесс? Мне нужен учебник для моей конкретной ситуации.

P.S. Objective Sharpie генерирует пустой класс привязки, если я «скармливаю» ему свой файл .h, вероятно, потому что он не является objective-c.


person Maxim V. Pavlov    schedule 08.07.2014    source источник


Ответы (1)


Поскольку это код C, вам следует использовать что-то вроде PInvoke Interop Assistant для создания привязок C #.

public partial class NativeMethods 
{
    [DllImport("<libnamehere>", 
        EntryPoint="sprec_flac_encode", 
        CallingConvention = CallingConvention.Cdecl)]
    public static extern int FlacEncode(
        [MarshalAs(UnmanagedType.LPStr)] string wavfile, 
        [MarshalAs(UnmanagedType.LPStr)] string flacfile) ;

}

Для библиотек C. Никакой проект привязки ObjectiveC не требуется. Просто создайте собственную библиотеку и добавьте ее в свой проект с помощью импорта Dll.

person SKall    schedule 08.07.2014
comment
Спасибо. Как вы узнали, что const char * превращается в [MarshalAs(UnmanagedType.LPStr)]? Подскажите, где про это почитать? - person Maxim V. Pavlov; 10.07.2014
comment
Вот ссылка на сортировку: msdn.microsoft.com /en-us/library/s9ts558h(v=vs.110).aspx - person SKall; 10.07.2014