我已经为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字符串吗?
答案 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]
。