MonoTouch绑定到NSString字段在发布版本中返回null

时间:2013-03-01 04:18:30

标签: c# objective-c zbar-sdk xamarin.ios

我已经成功创建了一个更新的ZBar MonoTouch绑定dll,following up on this answer here from a while ago,使用更新的[Field]绑定来绑定静态NSStrings(之前我只是复制了绑定dll中NSString的值)。

绑定dll编译正常(在发布模式下编译)。

使用我的应用程序中的绑定ZBar.dll在Debug版本中工作正常,从本机lib返回正确的NSString值。但是在Release版本中,它始终返回null。

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

我尝试关闭用于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;
            }
        }
    }
}

Monotouch:6.0.10

1 个答案:

答案 0 :(得分:3)

将此添加到项目的iOS Build options页面中的其他mtouch参数:

--nosymbolstrip=ZBarReaderControllerResults

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