如何在 Xamarin.iOS 中正确包装本机 c 库

Posted

技术标签:

【中文标题】如何在 Xamarin.iOS 中正确包装本机 c 库【英文标题】:How do I correctly wrap native c library in Xamarin.iOS 【发布时间】:2014-08-29 08:51:36 【问题描述】:

我正在尝试将本机 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 文档中的规范尚不清楚。鉴于我正在绑定本机库,我的解决方案中是否需要 Binding 项目。无论如何,我需要一个包装器调用来放入我的 DLLImport 定义?这个过程记录在哪里?我需要针对我的特殊情况的教程。

附:如果我“输入”我的 .h 文件,Objective Sharpie 会生成一个空的绑定类,可能是因为它不是 Objective-c。

【问题讨论】:

【参考方案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 导入将其添加到您的项目中。

【讨论】:

谢谢。你是怎么知道const char * 变成[MarshalAs(UnmanagedType.LPStr)] 的?你能告诉我在哪里可以读到它吗? 这里是编组参考:msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx

以上是关于如何在 Xamarin.iOS 中正确包装本机 c 库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xamarin iOS PickView 获取价值?

Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机

在 Xamarin.IOS 中执行本机代码时获得 SIGSEGV

从 Xamarin.iOS 绑定库中引用 Storyboard

“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库

Xamarin:使用本机库