Dear MonoTouch subscribers, The same question is here: http://stackoverflow.com/questions/11008726/binding-of-zebra-sdk-to-monotouch
Short version: I have created a binding for Zebra native library for mobile printers and the basic functionality works fine (wireless connection between the printer and the iPad, writing data to streams, printing out text, etc.) I want to print out PDFs and images, and the native library provides the classes for that. However, I can't get it to work from Monotouch. Long version: I have problem binding the structure described below. @protocol ZebraPrinterConnection - (BOOL) open; - (void) close; - (NSInteger) write:(NSData *)data error:(NSError **)error; - (NSData *)read: (NSError**)error; @interface TcpPrinterConnection : NSObject<ZebraPrinterConnection> { some @private properties } - (id)initWithAddress:(NSString *)anAddress andWithPort:( NSInteger)aPort; @interface ZebraPrinterFactory : NSObject { } +(id<ZebraPrinter,NSObject>) getInstance:(id<ZebraPrinterConnection, NSObject>) connection error:(NSError**)error The tricky part here is to obtain ZebraPrinter instance in Monotouch code. Note how ZebraPrinterFactory wants ZebraPrinterConnection to be passed to it, but onlyTcpPrinterConnection has an actual constructor. The connection classes work fine when bound like this: [BaseType (typeof (NSObject))] [Model] interface ZebraPrinterConnection { [Export ("open")] bool Open(); [Export ("close")] void Close(); [Export ("write:error:")] int Write(NSData data, out NSError error); [Export ("read:")] NSData Read(out NSError error); } [BaseType (typeof(NSObject))] interface TcpPrinterConnection : ZebraPrinterConnection { [Export ("initWithAddress:andWithPort:")] IntPtr Constructor (string anAddress, int aPort); } Binding of ZebraPrinterFactory class is not as straightforward. If I bind it like this: [BaseType (typeof(NSObject))] interface ZebraPrinterFactory { [Static, Export ("getInstance:error:")] ZebraPrinter getInstance(ZebraPrinterConnection connection, out NSError error); } then I try to use something like myConn = new TcpPrinterConnection(ipAddress, port); myConn.Open (); ZebraPrinter zPrinter = ZebraPrinterFactory.GetInstance(myConn, out err); // compile-time error: Cannot convert TcpPrinterConnection into ZebraPrinterConnection I get a compile-time error. If I change the binding for Mono to accept TcpPrinterConnection as parameter (I've tried multiple configurations), I get runtime exception ("System.InvalidCastException: Cannot cast from source type to destination type.") which has no inner exceptions and I have no idea which type could not be converted (strongly suspecting that same conversion as above). It's really frustrating having something ALMOST working, but not quite. Any ideas? I'm starting to think of binding limitations already. Could someone tell me if such structures can be bound at all? Regards, Dmitry
_______________________________________________ MonoTouch mailing list MonoTouch@lists.ximian.com http://lists.ximian.com/mailman/listinfo/monotouch