2012-04-07 14 views
1

Ich habe eine funktionierende MonoTouch-Bindung für ZBar, die läuft, aber ich habe Probleme, einen konstanten NSString aufzudecken, den die Obj-C-Bibliothek zur Verwendung als Schlüssel in einem definiert NSDictionary:Einen Obj-C const NSString über eine MonoTouch-Bindung freilegen

innen ZBarReaderController.h:

extern NSString* const ZBarReaderControllerResults; 

I zunächst über den Ist-Monotouch versucht wie dokumentiert here Bindung:

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

Der Versuch, das Projekt mit diesem gab diese Fehler von btouch zu bauen:

Unbehandelte Ausnahme: System.ArgumentOutOfRangeException: Argument außerhalb des Bereichs liegt.
Parametername: start
bei System.String.Substring (Int32 start) [0x00000] in: 0
bei Generator.Generate (System.Type Typ) [0x00000] in: 0
bei Generator.Go() [0x00000] in: 0
bei BindingTouch.Main (System.String [] args) [0x00000] in: 0
[FEHLER] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Argument ist außerhalb des Bereichs.
Parametername: start
bei System.String.Substring (Int32 start) [0x00000] in: 0
bei Generator.Generate (System.Type Typ) [0x00000] in: 0
bei Generator.Go() [0x00000] in: 0
bei BindingTouch.Main (System.String [] args) [0x00000] in: 0

versuchte ich, wie in diesem anderen SO answer vorgeschlagen neben manuell in den Code aufrufen.

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"); 
    } 
} 

Es baut und führt in Ordnung, aber nur einen leeren String zurück (wie die Dlfcn.GetStringConstant Dokumente wird es tun, wenn es keine Verbindung herstellen kann).

Also, jemand anderes zugegriffen Const Strings aus einer Obj-C-Bibliothek von Drittanbietern?

+0

Ich nehme an, Sie haben ** 'ZBarReaderControllerResults' in einer Ihrer Implementierungsdateien ** definiert, richtig? Und Sie haben gegen diese Implementierung verlinkt? Außerdem würde ich nicht erwarten, dass Dlfcn mit einer statischen Bibliothek (.a-Datei) arbeitet. Es ist für dynamische Bibliotheken (.dylib-Datei) und Sie müssen sicherstellen, dass es diese Bibliothek findet. Siehe die [dlopen (1) man-Seite] (https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dlopen.3.html). –

+0

Nun, ich persönlich, nein - ich nehme an, dass es innerhalb der zbar SDK-Bibliothek (der Bibliothek libzbar.a) implementiert ist, da diese Deklaration innerhalb der Header-Dateien liegt, die mit dem SDK geliefert werden. Und ja, es ist definitiv gegen diese Implementierung korrekt zu verknüpfen - ich habe alle wichtigen Teile der Bibliothek bereits funktioniert (zeigt den ReaderViewController, Erfassen von Barcodes, etc). Wie für Dlfcn und Dlopen, ich habe noch nie dlopen oder viel Unix-Stil native Programmierung verwendet, so dass ich nicht sicher war - danke, dass Sie für mich klären, ich werde aufhören, diesen Pfad zu untersuchen. – Tyson

+0

Dies wurde (https://bugzilla.xamarin.com/show_bug.cgi?id=4333) ausgefüllt (danke) – poupou

Antwort

2

Der Generator, btouch, hatte eine Einschränkung (vor 5.2.11) für [Field] Bindungen, die den Namespace benötigt, um mit MonoTouch. zu starten.

Eine schnelle Abhilfe für dieses issue ist, die Namespaces von ZBar zu MonoTouch.ZBar umzubenennen, und die Bindungsdefinitionen werden korrekt erstellt.

Da iOS-Anwendungen für Bibliotheken, die in einer Anwendung enthalten sind, mit statischen Bibliotheken (.a) verknüpft werden müssen, muss auch der Bibliotheksname "__Internal" in den Bindungen angegeben werden, wie in documentation beschrieben.

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

Es gab auch eine Kompilation Ausgabe (auf den generierten Code), die eine manuelle Einstellung für die Bibliothek erforderlich (das heißt Sie null anstelle des Bibliotheksnamen verwenden kann, da es innerhalb der Haupt App verknüpft ist). Dies ist auch in der MonoTouch 5.2.11 Version behoben.

Mit den Problemumgehungen (oder MonoTouch 5.2.11) und der __Internal Änderung sollten Sie [Field] in Ihren Bindungen verwenden können.

Verwandte Themen