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

时间:2012-04-07 13:52:53

标签: c# objective-c xamarin.ios

我已经为ZBar启动并运行了一个正常工作的MonoTouch绑定,但是我遇到了暴露一个常量NSString的麻烦,Obj-C库定义它用作NSDictionary中的Key:

在ZBarReaderController.h中:

extern NSString* const ZBarReaderControllerResults;  

我首先通过实际的MonoTouch绑定尝试了here

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

尝试构建包含此项目的项目会从btouch中产生这些错误:

  

未处理的异常:System.ArgumentOutOfRangeException:参数超出范围。
  参数名称:startIndex
      在System.String.Substring(Int32 startIndex)[0x00000] in:0
      在Generator.Generate(System.Type类型)[0x00000] in:0
      在Generator.Go()[0x00000] in:0
      在BindingTouch.Main(System.String [] args)[0x00000] in:0
  [ERROR]致命的未处理异常:System.ArgumentOutOfRangeException:参数超出范围。
  参数名称:startIndex
      在System.String.Substring(Int32 startIndex)[0x00000] in:0
      在Generator.Generate(System.Type类型)[0x00000] in:0
      在Generator.Go()[0x00000] in:0
      在BindingTouch.Main(System.String [] args)[0x00000] in:0

我接下来尝试按照其他SO answer中的建议手动调用代码。

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库中访问了const字符串吗?

1 个答案:

答案 0 :(得分:2)

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

issue的快速解决方法是将名称空间从ZBar重命名为MonoTouch.ZBar,并且绑定定义将正确构建。

由于iOS应用程序必须与应用程序附带的库链接静态库(.a),因此还需要在documentation中描述的绑定中提供库名"__Internal"。 / p>

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

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

使用变通方法(或MonoTouch 5.2.11)和__Internal更改,您应该可以在绑定中使用[Field]