2

ZBar ライブラリの MonoTouch バインディングを作成しようとしていますが、ZBarSymbolSet型に行き詰まっています。一見するととてもシンプルに見えます:

@interface ZBarSymbolSet
    : NSObject <NSFastEnumeration>
{
    const zbar_symbol_set_t *set;
    BOOL filterSymbols;
}

@property (readonly, nonatomic) int count;
@property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
@property (nonatomic) BOOL filterSymbols;

- (id) initWithSymbolSet: (const zbar_symbol_set_t*) set;

@end


@interface ZBarSymbol : NSObject
... I've left out the ZBarSymbol members, all thats important is that the ZBarSymbolSet should be an IEnumerable<ZBarSymbol>
@end

IEnumerableしかし、問題は、標準の .NETインターフェイスをNSFastEnumeratorプロトコルの実装にバインドする方法を調べ始めたときに始まりました。どこから始めればいいのか本当にわかりません。

4

1 に答える 1

2

そのため、バインド クラスでインターフェイスの実装NSFastEnumerableを提供するためにプロトコル メソッドを接続するように btouch に自動的に指示する方法が見つかりませんでした。IEnumerable代わりに、手動のアプローチを採用し、IEnumerable 実装を使用して独自の部分クラスを追加しました。この中で、この Obj-C ライブラリがラップしていた C ライブラリを実際に直接呼び出す必要がありました。

public partial class ZBarSymbolSet : IEnumerable<ZBarSymbol>
{
    public IEnumerator<ZBarSymbol> GetEnumerator ()
    {
        IntPtr symbol;
        if ( FilterEnabled )
            symbol = zbar_symbol_set_first_symbol(this.InnerNativeSymbolSetHandle);
        else
            symbol = zbar_symbol_set_first_unfiltered(this.InnerNativeSymbolSetHandle);

        while ( symbol != IntPtr.Zero )
        {
            yield return new ZBarSymbol(symbol,0);
            symbol = zbar_symbol_next(symbol);
        }
    }

    IEnumerator IEnumerable.GetEnumerator ()
    {
        return GetEnumerator();
    }

    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_next(IntPtr zBarSymbol); 

    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_set_first_symbol(IntPtr zbarSymbolSet); 

    [DllImport("__Internal")]
    private extern static IntPtr zbar_symbol_set_first_unfiltered(IntPtr zbarSymbolSet);
}  

上記InnerNativeSymbolSetHandleで C 関数に渡すために使用したのは、私が ZBarSymbolSet クラスにバインドしたプロパティでした。幸いなことに、ZBar iPhone SDK の作成者が、C ZBar ライブラリから基礎となる構造体へのポインタを公開していたからです。

// @interface ZBarSymbolSet : NSObject <NSFastEnumeration>
[BaseType (typeof(NSObject))]
interface ZBarSymbolSet
{
    // @property (readonly, nonatomic) int count;
    [Export("count")]
    int Count { get; }

    // @property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
    [Export("zbarSymbolSet")]
    IntPtr InnerNativeSymbolSetHandle{ get; }

    // @property (nonatomic) BOOL filterSymbols;
    [Export("filterSymbols")]
    bool FilterEnabled { get; set; }
}  

したがって、これは手動のソリューションです。
私はまだbtouchがこれを行うための自動的な方法があることを望んでいます(明らかにこれらのC関数を介してではなくcountByEnumeratingWithState、プロトコルの関数にフックすることを介して)。objective NSFastEnumeration-cがobjective-c forループを使用して一般的な方法でそれを行うことができる場合、確かにMonoTouchも自動的にフックできますか?

于 2012-04-08T13:25:30.180 に答える