1

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

在 ZBarReaderController.h 中:

extern NSString* const ZBarReaderControllerResults;  

我首先尝试通过此处记录的实际 MonoTouch 绑定:

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

尝试构建包含此内容的项目会导致 btouch 出现以下错误:

未处理的异常:System.ArgumentOutOfRangeException:参数超出范围。
参数名称: startIndex
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
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: 参数超出范围。
参数名称:startIndex
at System.String.Substring (Int32 startIndex) [0x00000] in :0
at Generator.Generate (System.Type type) [0x00000] in :0
at Generator.Go () [0x00000] in :0
在 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文档,如果链接失败,它将执行此操作)。

那么,还有其他人从第 3 方 Obj-C 库中访问 c​​onst 字符串吗?

4

1 回答 1

2

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

问题的快速解决方法是将命名空间从ZBarto重命名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]在绑定中使用的更改。

于 2012-04-09T13:16:23.133 回答