我已經有一個工作的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字符串?
我假設你已經在其中一個實現文件中定義了** 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
不是我個人,不是 - 我假設它是在zbar SDK庫(libzbar.a庫)中實現的,因爲該聲明位於隨SDK提供的頭文件中。是的,它確實正確地鏈接到該實現 - 我已經使庫的所有重要部分都工作了(顯示ReaderViewController,捕獲條形碼等)。至於dlfcn和dlopen,我從來沒有使用過dlopen或者做過很多Unix風格的本地編程,所以我不確定 - 謝謝你爲我清理這些,我會停止調查這個路徑。 – Tyson 2012-04-07 15:03:35
這是填充(謝謝)https://bugzilla.xamarin.com/show_bug.cgi?id=4333 – poupou 2012-04-08 21:27:58