2012-04-07 5 views
1

ZBarのMonoTouchバインディングが正常に動作していますが、Obj-Cライブラリが定義している定数NSStringを公開するのに問題があります。 NSDictionaryの:ZBarReaderController.h内部MonoTouchバインディングを介してObj-C const NSStringを公開する

extern NSString* const ZBarReaderControllerResults; 

Iは初めて文書hereとして結合実際MonoTouchで介して試みた:

[Static] 
interface ZBarSDK 
{ 
    [Field ("ZBarReaderControllerResults")] 
    NSString BarcodeResultsKey { get; } 
} 
これを含むプロジェクトをビルドしようとすると

がbtouchから、これらのエラーを与えた:

未処理の例外:System.ArgumentOutOfRangeExceptionが:引数が範囲外です。
パラメータ名:System.String.Substring(のInt32のstartIndex)でのstartIndex
[0x00000]:0 Generator.Generate(のSystem.Type型)[0x00000]内で
:Generator.Goで0
() [0x00000]で:でBindingTouch.Mainで0
(可能System.String []引数)[0x00000]:0
[ERROR] FATAL未処理の例外:System.ArgumentOutOfRangeExceptionが:引数が範囲外です。
パラメータ名:System.String.Substring(のInt32のstartIndex)でのstartIndex
[0x00000]:0 Generator.Generate(のSystem.Type型)[0x00000]内で
:Generator.Goで0
() [0x00000]で:でBindingTouch.Mainで0
(可能System.String []引数)[0x00000]:0

私は次のこの他のSO answerに示唆されているように、手動でコードを呼び出すことを試みました。

public static NSString BarcodeResultsKey 
{ 
    get 
    { 
     var libHandle = Dlfcn.dlopen("libzbar.a",0); 
     // I also tried this with "__Internal", rather than "libzbar.a" 
     return Dlfcn.GetStringConstant(libHandle, "ZBarReaderControllerResults"); 
    } 
} 

それは構築し、罰金実行し、ちょうど(それはリンクに失敗した場合、それがどうなるDlfcn.GetStringConstant文書として)空の文字列を返します。

他の誰かが第三者Obj-Cライブラリからconst文字列にアクセスしましたか?

+0

私は**あなたの実装ファイルの中に** 'ZBarReaderControllerResults'を定義したと思いますか?あなたはその実装とリンクしていますか?また、私はDlfcnが静的ライブラリ(.aファイル)で動作することを期待していません。ダイナミックライブラリ(.dylibファイル)用であり、そのライブラリが見つかっていることを確認する必要があります。 [dlopen(1)のマニュアルページ](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dlopen.3.html)を参照してください。 –

+0

私は個人的にはそうではありませんが、SDKで提供されているヘッダーファイル内にzbar SDKライブラリ(libzbar.aライブラリ)が実装されていると仮定しています。そして、そうですね、それは間違いなくその実装と正しく結びついています - 私はライブラリの重要な部分をすべて既に持っています(ReaderViewControllerの表示、バーコードのキャプチャなど)。 dlfcnとdlopenに関しては、私はdlopenを使ったことがありませんし、Unixスタイルのネイティブプログラミングをしていたこともありませんでした。私は確信が持てませんでした。 – Tyson

+0

これは、https://bugzilla.xamarin.com/show_bug.cgi?id=4333として記入されました(ありがとうございます)。 – poupou

答えて

2

で始まる名前空間を必要とする[Field]バインディングでは、発電機btouchに制限があります(5.2.11より前)。

このissueのための迅速な回避策はZBarMonoTouch.ZBarへと結合の定義が正しく構築されますから、名前空間の名前を変更することです。

iOSアプリケーションは、アプリケーションに含まれるライブラリの静的ライブラリ(.a)にリンクする必要があるため、documentationに記載されているように、ライブラリ名"__Internal"をバインディングに指定する必要があります。

[Static] 
interface ZBarSDK { 
    [Field ("ZBarReaderControllerResults", "__Internal")] 
    NSString BarcodeResultsKey { get; } 
} 

ライブラリーのためのいくつかの手動調整が必要(生成されたコードに)コンパイルの問題は、(それがメインのアプリ内でリンクされているので、すなわち、あなたはライブラリ名の代わりにnullを使用することができます)もありました。これはMonoTouch 5.2.11リリースでも修正されています。回避策(またはMonoTouchで5.2.11)と、あなたのバインディング内[Field]を使用することができるはず__Internal変更に伴い

関連する問題