我已经成功创建了一个更新的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
答案 0 :(得分:3)
将此添加到项目的iOS Build options页面中的其他mtouch参数:
--nosymbolstrip=ZBarReaderControllerResults
Debug和Release版本之间的区别在于Release版本被剥离,因此删除了该字段的符号,因此Xamarin.iOS无法在运行时找到它。此选项将使Xamarin.iOS告诉链接器它应该保留该符号,即使未使用该符号(请注意,该字段的绑定是在运行时发生的动态绑定,因此本机strip
工具无法看到该字段实际使用过。)