2012-04-07 19 views
1

我已經有一個工作的MonoTouch綁定了ZBar並且正在運行,但是我遇到了一個麻煩,暴露了一個常量NSString,Obj-C庫定義用作Key中的一個鍵的NSDictionary:通過MonoTouch綁定公開一個Obj-C常量NSString

內ZBarReaderController.h:

extern NSString* const ZBarReaderControllerResults; 

我第一次通過實際的MonoTouch嘗試作爲記錄here結合:

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

試圖建立一個包含這給了這些錯誤btouch項目:

未處理的異常信息:System.ArgumentOutOfRangeException:參數超出範圍。
參數名稱:的startIndex
在System.String.Substring(的Int32的startIndex)[0x00000]在:0
在Generator.Generate(System.Type的類型)[0x00000]在:0
在Generator.Go() [0x00000] in:0
at BindingTouch.Main(System.String [] args)[0x00000] in:0
[錯誤]致命未處理異常:System.ArgumentOutOfRangeException:參數超出範圍。
參數名稱:的startIndex
在System.String.Substring(的Int32的startIndex)[0x00000]在:0
在Generator.Generate(System.Type的類型)[0x00000]在:0
在Generator.Go() [0x00000]在:0
在BindingTouch.Main(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)。 – 2012-04-07 14:56:18

+0

不是我個人,不是 - 我假設它是在zbar SDK庫(libzbar.a庫)中實現的,因爲該聲明位於隨SDK提供的頭文件中。是的,它確實正確地鏈接到該實現 - 我已經使庫的所有重要部分都工作了(顯示ReaderViewController,捕獲條形碼等)。至於dlfcn和dlopen,我從來沒有使用過dlopen或者做過很多Unix風格的本地編程,所以我不確定 - 謝謝你爲我清理這些,我會停止調查這個路徑。 – Tyson 2012-04-07 15:03:35

+0

這是填充(謝謝)https://bugzilla.xamarin.com/show_bug.cgi?id=4333 – poupou 2012-04-08 21:27:58

回答

2

對於[Field]綁定,生成器btouch有一個限制(5.2.11之前),該綁定需要名稱空間以MonoTouch.開頭。

對此issue的快速解決方法是將名稱空間從ZBar重命名爲MonoTouch.ZBar,並且綁定定義將正確構建。

由於iOS應用程序必須與應用程序中包含的庫的靜態庫(.a)鏈接,因此還需要在如documentation中所述的綁定中提供庫名"__Internal"

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

也有其需要的圖書館借了一些手動調整彙編問題(上生成的代碼)(即可以使用null,而不是庫的名稱,因爲它是主要的應用程序內的鏈接)。這在MonoTouch 5.2.11發行版中也得到了修復。

通過變通方法(或MonoTouch 5.2.11)和__Internal更改,您應該可以在綁定中使用[Field]