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

C# MonoTouch绑定到NSString字段,在发布版本中返回null,c#,objective-c,zbar-sdk,xamarin.ios,C#,Objective C,Zbar Sdk,Xamarin.ios,我已经成功地创建了一个更新的ZBar MonoTouch绑定dll,使用更新的[Field]绑定绑定静态NSString(以前我只是在绑定dll中复制NSString的值) 绑定dll编译良好(在发布模式下编译) 使用我的应用程序中的绑定ZBar.dll在调试版本中工作良好,从本机库返回正确的NSString值。但是在发布版本中,它总是返回null 请注意,我将链接器行为设置为剥离调试和发布版本的所有程序集,因此这与链接器剥离任何内容无关 我尝试关闭LLVM编译器以进行发布,但它在发布版本中仍然

我已经成功地创建了一个更新的ZBar MonoTouch绑定dll,使用更新的[Field]绑定绑定静态NSString(以前我只是在绑定dll中复制NSString的值)

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

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

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

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

以下是约束代码:

[Static]
interface ZBarSDK
{
    // extern NSString* const ZBarReaderControllerResults;
    [Field ("ZBarReaderControllerResults", "__Internal")]
    NSString BarcodeResultsKey { get; }
}
这是反编译的IL(根据MonoDevelop):


Monotouch:6.0.10

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

--nosymbolstrip=ZBarReaderControllerResults

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

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

--nosymbolstrip=ZBarReaderControllerResults

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

是否确实需要“\u Internal”FieldAttribute的第二个参数?@StephaneDelcroix是,根据:如果静态链接,则没有可绑定的库,因此需要使用name@StephaneDelcroix此外,它在启用调试模式时也可以工作。你可能会认为这样的事情会破坏所有情况。你确定需要FieldAttribute的第二个参数“\uuu Internal”吗?@StephaneDelcroix是的,根据:如果你是静态链接,没有要绑定的库,所以你需要使用\uu Internalname@StephaneDelcroix此外启用调试模式时,它会工作。你可能会认为这样的事情会在所有情况下打破它。谢谢,听起来很有希望,明天会测试。出于好奇,我们谈论的是哪一层链接?这不是管理的IL链接/剥离,是吗?您说本机符号正在从预编译的本机Zbar lib文件中剥离?我不知道在MT内发生了什么?这是本地条带工具(从终端运行
manstrip
查看更多信息)。默认情况下,Xamarin.iOS会对发布版本执行此操作,以使其更小。您可以将
--nosymbolstrip
(不带任何参数)传递给mtouch以完全禁用此功能,如果您想看到差异的话。好的,让它工作了,谢谢Rolf!但是,我需要删除下划线前缀,即我使用了
--nosymbolstrip=ZBarReaderControllerResults
。这只是你答案中的一个输入错误吗?然而,此修复程序并不是一个理想的解决方案-它意味着每个使用ZBar.dll的应用程序都需要执行此配置。有没有办法将此指令嵌入MT,我是说,Xamarin.iOS;)绑定ZBar.dll本身?@Tyson:我不确定下划线是否正确,我猜我猜错了(我现在已经修复了答案)。我们的想法是最终让Xamarin.iOS自动检测这些字段,而不需要通过——根本不需要任何符号trip。谢谢,这听起来很有希望,明天将进行测试。出于好奇,我们谈论的是哪一层链接?这不是管理的IL链接/剥离,是吗?您说本机符号正在从预编译的本机Zbar lib文件中剥离?我不知道在MT内发生了什么?这是本地条带工具(从终端运行
manstrip
查看更多信息)。默认情况下,Xamarin.iOS会对发布版本执行此操作,以使其更小。您可以将
--nosymbolstrip
(不带任何参数)传递给mtouch以完全禁用此功能,如果您想看到差异的话。好的,让它工作了,谢谢Rolf!但是,我需要删除下划线前缀,即我使用了
--nosymbolstrip=ZBarReaderControllerResults
。这只是你答案中的一个输入错误吗?然而,此修复程序并不是一个理想的解决方案-它意味着每个使用ZBar.dll的应用程序都需要执行此配置。有没有办法将此指令嵌入MT,我是说,Xamarin.iOS;)绑定ZBar.dll本身?@Tyson:我不确定下划线是否正确,我猜我猜错了(我现在已经修复了答案)。这样做的目的是最终使Xamarin.iOS自动检测这些字段,而不需要通过——根本不需要符号trip。