通过 MonoTouch 绑定公开 Obj-C const NSString

本文关键字:Obj-C const NSString MonoTouch 绑定 通过 | 更新日期: 2023-09-27 18:30:32

我已经启动并运行了ZBar的MonoTouch绑定,但是在公开Obj-C库定义为用作NSDictionary中的键的常量NSString时遇到了麻烦:

在ZBarReaderController.h中:

extern NSString* const ZBarReaderControllerResults;  

我首先尝试通过实际的MonoTouch绑定,如下所述:

[Static]
interface ZBarSDK
{
    [Field ("ZBarReaderControllerResults")]
    NSString BarcodeResultsKey { get; }
}

尝试构建包含以下内容的项目会从 btouch 中产生以下错误:

未处理的异常:System.ArgumentOutOfRangeException:参数超出范围。
参数名称:启动索引
at System.String.Substring (Int32 startIndex) [0x00000] in :0
at Generator.Generate (System.Type type) [0x00000] in :0
at Generator.Go () [0x00000] in :0
at BindingTouch.Main (System.String[] args) [0x00000] in :0
[错误]致命的未处理异常:System.ArgumentOutOfRangeException:参数超出范围。
参数名称:启动索引
at System.String.Substring (Int32 startIndex) [0x00000] in :0
at Generator.Generate (System.Type type) [0x00000] in :0
at Generator.Go () [0x00000] in :0
at BindingTouch.Main (System.String[] args) [0x00000] in :0

接下来,我尝试按照另一个 SO 答案中的建议手动调用代码。

public static NSString BarcodeResultsKey
{
    get
    {
        var libHandle = Dlfcn.dlopen("libzbar.a",0);
        // I also tried this with "__Internal", rather than "libzbar.a"
        return Dlfcn.GetStringConstant(libHandle, "ZBarReaderControllerResults");
    }
}

它构建和执行正常,但只返回一个空字符串(如 Dlfcn.GetStringConstant 文档,如果链接失败,它将这样做)。

那么,还有其他人从第三方 Obj-C 库中访问了常量字符串吗?

通过 MonoTouch 绑定公开 Obj-C const NSString

生成器

btouch[Field]绑定有一个限制(在 5.2.11 之前),要求命名空间以 MonoTouch. 开头。

此问题的快速解决方法是将命名空间从 ZBar 重命名为 MonoTouch.ZBar,绑定定义将正确生成。

由于 iOS 应用程序必须与应用程序附带的库的静态库 (.a) 链接,因此还需要提供库名称"__Internal"绑定,如文档中所述。

[Static]
interface ZBarSDK {
    [Field ("ZBarReaderControllerResults", "__Internal")]
    NSString BarcodeResultsKey { get; }
}

还有一个编译问题(在生成的代码上),需要对库进行一些手动调整(即您可以使用null而不是库名称,因为它在主应用程序内链接)。这也在MonoTouch 5.2.11版本中得到了修复。

使用解决方法(或 MonoTouch 5.2.11)和__Internal更改,您应该能够在绑定中使用[Field]