2013-03-01 51 views
0

我已成功创建更新的ZBar MonoTouch绑定DLL,following up on this answer here from a while ago,使用更新的[Field]绑定来绑定静态NSStrings(以前我只是复制了NSString的值绑定DLL)。MonoTouch绑定到NSString在发布版本中返回null

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

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

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

我试着关闭发布的LLVM编译器,它仍然在发布版本中返回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

+0

你确定你需要FieldAttribute的“__Internal”第二个参数吗? – 2013-03-01 12:00:40

+0

@StephaneDelcroix是的,根据[绑定文档(字段部分)](http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries#37-binding-fields):_如果您要静态链接,没有要绑定的库,因此您需要使用__Internal name_ – Tyson 2013-03-01 12:16:20

+0

@StephaneDelcroix此外,它在启用调试模式时工作。你会认为这样会破坏它的所有情况。 – Tyson 2013-03-01 12:18:34

回答

3

此加入额外的mTouch参数在项目的iOS Build options页面中:

--nosymbolstrip=ZBarReaderControllerResults 

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

+0

谢谢,这听起来很有希望,明天会测试。出于好奇,我们在谈论什么层面的链接?这不是托管的IL链接/剥离吗?你说本地符号正在从预编译的本地Zbar库文件中被剥离?我不知道在MT内发生了什么?这是记录在任何地方? – Tyson 2013-03-01 14:57:03

+0

这是本地条形工具(从终端运行'man strip'以查看更多信息)。这是Xamarin.iOS默认的发布版本,以使它们更小。你可以传递'--nosymbolstrip'(没有任何参数)到mtouch来完全禁用它,如果你想知道它的差异。 – 2013-03-01 20:09:19

+0

好吧,工作,感谢Rolf!不过,我需要删除下划线前缀,即我使用'--nosymbolstrip = ZBarReaderControllerResults'。这只是你答案中的一个错字吗? – Tyson 2013-03-02 01:05:58

相关问题