将Zebra SDK绑定到Monotouch?

时间:2012-06-13 05:30:05

标签: binding sdk xamarin.ios zebra-printers

我正在使用Monotouch的iPad应用程序(5.2.12)。该应用程序将与Zebra的移动打印机一起使用,因此我们从它们获得了SDK(.a库和标题)。所以我去阅读所有指南和教程,并为它创建了一个绑定项目(只有2个连接类)。我非常高兴能够快速完成基本文本和标签打印。

但我们需要打印PDF。要做到这一点,我需要绑定更多的类,我现在无法弄清楚如何2天。这是库的一般设置:

ZebraPrinterConnection协议由TcpPrinterConnection接口实现。 ZebraPrinterFactory接口用于获取ZebraPrinter协议的实例,并要求将ZebraPrinterConnection传递给它。

这是绑定的核心:

ZebraPrinterConnection

标题(.h)

@protocol ZebraPrinterConnection        
    - (BOOL) open;
    - (void) close;
    - (NSInteger) write:(NSData *)data error:(NSError **)error;
    - (NSData *)read: (NSError**)error;

绑定(.cs)

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

TcpPrinterConnection

标题(.h)

@interface TcpPrinterConnection : NSObject<ZebraPrinterConnection>
  - (id)initWithAddress:(NSString *)anAddress andWithPort:(NSInteger)aPort;

绑定(.cs)

[BaseType (typeof(ZebraPrinterConnection))]
interface TcpPrinterConnection {        
    [Export ("initWithAddress:andWithPort:")]
    IntPtr Constructor (string anAddress, int aPort);
}       

ZebraPrinterFactory

标题(.h)

@interface ZebraPrinterFactory : NSObject
  +(id<ZebraPrinter,NSObject>) getInstance:(id<ZebraPrinterConnection, NSObject>) 
    connection error:(NSError**)error

绑定(.cs)

[BaseType (typeof(NSObject))]
interface ZebraPrinterFactory {
  [Static, Export ("getInstance:error:")]
  ZebraPrinter getInstance(ZebraPrinterConnection connection, out NSError error);
}

问题:

请注意ZebraPrinterFactory如何将ZebraPrinterConnection传递给它,但只有TcpPrinterConnection有一个实际的构造函数。

如果我尝试使用类似的东西:

NSError err;
TcpPrinterConnection conn;
conn = new TcpPrinterConnection(ipAddress, port);
bool connectionOK = conn.Open ();
ZebraPrinter zPrinter = ZebraPrinterFactory.getInstance(conn, out err); 

然后我得到一个“System.InvalidCastException:无法从源类型转换为目标类型。”在运行时......

知道你几乎让它运转起来是一种可怕的感觉,但并不完全......如何解决这个问题?

UPDATE:好的,我完全从绑定中删除了ZebraPrinterConnection类,将其方法复制到TcpPrinterConnection中(如Jonathan所建议的那样)。仍然没有运气(同样的例外)。然后绑定另一个类,该类具有期望ZebraPrinterConnection作为参数的方法,并且这个方法可以像丝绸一样平滑。

标题(.h)

@interface SGD : NSObject {}
  +(NSString*) GET: (NSString*) setting 
    withPrinterConnection: (id<ZebraPrinterConnection,NSObject>) printerConnection 
    error:(NSError**)error;

绑定(.cs)

[BaseType (typeof (NSObject))]
interface SGD 
{
  [Static, Export ("GET:withPrinterConnection:error:")]
  string Get (string setting, TcpPrinterConnection printerConnection, out NSError error);
}

我开始怀疑ZebraPrinterFactory类的实现是问题的根源,现在可以绑定其他类而没有任何问题。另一方面,它可能与返回的ZebraPrinter类实例有关。可能是Mono无法将ZebraPrinter映射到工厂类返回的东西吗?

2 个答案:

答案 0 :(得分:1)

我不熟悉MonoTouch,但了解斑马apis。希望sdk工作方式的一些背景将有助于这些单声道映射

因此,ZebraPrinterFactory是一个简单的工厂,它询问打印机连接以确定您拥有的打印机型号(ZPL或CPCL)。工厂的返回类型是接口ZebraPrinterZebraPrinter的具体类型是内部的,未记录的类ZebraPrinterZplZebraPrinterCpcl。这两个具体类都符合ZebraPrinter接口,可以在打印机上执行功能。我们选择这样做是为了抽象出去了解打印机语言的必要性。但是如果Mono需要了解一个具体类来执行映射,那么可以将返回值转换为具体类ZebraPrinterCpclZebraPrinterZpl(取决于您的打印机型号,小型移动打印机可能是cpcl,大桌面或桌面是ZPL)

你也可以通过调用它的构造函数来实现一个具体类型的打印机来绕过工厂(不幸的是,它没有记录,因为工厂是首选的方法)但它会是这样的:

ZebraPrinterCpcl myPrinter = new ZebraPrinterCpcl(conn);  
//or using the base interface as the type... and you may need to pass in an NSError also, I forget now...
ZebraPrinter myPrinter = new ZebraPrinterCpcl(conn);

希望这有帮助!

答案 1 :(得分:0)

而不是:

[BaseType (typeof(NSObject))]
interface TcpPrinterConnection : ZebraPrinterConnection {  

使用:

[BaseType (typeof(ZebraPrinterConnection ))]
interface TcpPrinterConnection { 

然后绑定项目应该正确设置您的继承。 BaseType属性确定基类,而不是实际继承接口(我知道它有点奇怪)。