0

我已经成功地创建了一个更新的 ZBar MonoTouch 绑定 dll,不久前在此处跟进这个答案,使用更新的 [Field] 绑定来绑定静态 NSStrings(以前我只是在我的绑定 dll 中复制 NSString 的值)。

绑定 dll 编译良好(在发布模式下编译)。

并且使用我的应用程序中的绑定 ZBar.dll 在调试版本中工作正常,从本机库返回正确的 NSString 值。但是在 Release 版本中,它总是返回 null。

请注意,我将链接器行为设置为剥离调试和发布版本的所有程序集,因此与链接器剥离任何内容无关。

我尝试为 Release 关闭 LLVM 编译器,但它仍然在 Release 版本中返回 null。但是,在 Release 版本中启用调试可以修复它(但显然不是解决方案)。

下面是绑定代码:

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

这是反编译的 IL(根据 MonoDevelop):

namespace ZBar
{
    public static class ZBarSDK
    {
        [CompilerGenerated]
        private static NSString _BarcodeResultsKey;

        [CompilerGenerated]
        private static readonly IntPtr __Internal_libraryHandle = Dlfcn.dlopen(null, 0);

        public static NSString BarcodeResultsKey
        {
            get
            {
                if (ZBarSDK._BarcodeResultsKey == null)
                {
                    ZBarSDK._BarcodeResultsKey = Dlfcn.GetStringConstant(ZBarSDK.__Internal_libraryHandle, "ZBarReaderControllerResults");
                }
                return ZBarSDK._BarcodeResultsKey;
            }
        }
    }
}

单点触控:6.0.10

4

1 回答 1

3

将此添加到项目的 iOS 构建选项页面中的其他 mtouch 参数中:

--nosymbolstrip=ZBarReaderControllerResults

Debug 和 Release 版本之间的区别在于 Release 版本被剥离,因此删除了该字段的符号,因此 Xamarin.iOS 在运行时找不到它。此选项将使 Xamarin.iOS 告诉链接器它应该保留该符号,即使该符号未使用(请注意,与字段的绑定是在运行时发生的动态绑定,因此本机strip工具无法看到实际使用该字段)。

于 2013-03-01T13:31:55.940 回答