【发布时间】:2012-04-07 13:52:52
【问题描述】:
我已经为ZBar 提供了一个有效的 MonoTouch 绑定并正在运行,但是在公开 Obj-C 库定义的用作 NSDictionary 中的键的常量 NSString 时遇到了麻烦:
在 ZBarReaderController.h 中:
extern NSString* const ZBarReaderControllerResults;
我首先尝试通过 here 记录的实际 MonoTouch 绑定:
[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
[错误] 致命的未处理异常: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 文档,如果链接失败,它将执行此操作)。
那么,还有其他人从第 3 方 Obj-C 库中访问 const 字符串吗?
【问题讨论】:
-
我假设您已经在您的一个实现文件中定义
ZBarReaderControllerResults,对吧?你已经链接到那个实现了吗?另外,我不希望 Dlfcn 使用静态库(.a 文件)。它适用于动态库(.dylib 文件),您需要确保它正在找到该库。请参阅dlopen(1) man page。 -
不是我个人,不 - 我假设它是在 zbar SDK 库(libzbar.a 库)中实现的,因为该声明在 SDK 提供的头文件中。是的,它肯定与该实现正确链接——我已经让库的所有重要部分都在工作(显示 ReaderViewController、捕获条形码等)。至于 dlfcn 和 dlopen,我以前从未使用过 dlopen 或做过很多 Unix 风格的本地编程,所以我不确定 - 感谢您为我清理,我将停止调查该路径。
标签: c# objective-c xamarin.ios