更新された ZBar MonoTouch バインディング dll の作成に成功し、しばらく前からこの回答をフォローアップし、更新された [Field] バインディングを使用して静的 NSString をバインドしました (以前は、バインディング dll で NSString の値を複製していました)。
バインディング dll は正常にコンパイルされます (リリース モードでコンパイル)。
また、私のアプリからバインディング ZBar.dll を使用すると、デバッグ ビルドで正常に動作し、ネイティブ ライブラリから正しい NSString 値が返されます。ただし、リリース ビルドでは常に null を返します。
デバッグ ビルドとリリース ビルドの両方ですべてのアセンブリを削除するようにリンカーの動作を設定しているため、リンカーが何かを削除することとは関係がないことに注意してください。
Release の LLVM コンパイラをオフにしてみましたが、Release ビルドではまだ null が返されます。ただし、リリース ビルドでデバッグを有効にすると修正されます (明らかに解決策ではありません)。
バインディングコードは次のとおりです。
[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