0

更新された 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

4

1 に答える 1

3

プロジェクトのiOSビルドオプションページの追加のmtouch引数にこれを追加します。

--nosymbolstrip=ZBarReaderControllerResults

デバッグビルドとリリースビルドの違いは、リリースビルドが削除されるため、フィールドのシンボルが削除されるため、Xamarin.iOSは実行時にそれを見つけることができません。このオプションにより、Xamarin.iOSは、シンボルが使用されていない場合でも、そのシンボルを保持する必要があることをリンカーに通知します(フィールドへのバインディングは実行時に発生する動的バインディングであるため、ネイティブstripツールは表示できません。フィールドが実際に使用されていること)。

于 2013-03-01T13:31:55.940 に答える