通过 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 库中访问了常量字符串吗?
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]
。