2

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

但是我们需要打印 PDF。为此,我需要绑定更多的课程,但我现在 2 天不知道怎么做。这是库的一般设置:

ZebraPrinterConnection 协议由 TcpPrinterConnection 接口实现。ZebraPrinterFactory 接口用于获取 ZebraPrinter 协议的实例,需要将 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);
}       

斑马打印机厂

标头 (.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:无法从源类型转换为目标类型。” 在运行时...

知道您几乎可以正常工作,但并不完全正常,这是一种可怕的感觉……如何解决这个问题?

更新:好的,我从绑定中完全删除了 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 映射到工厂类返回的东西?

4

2 回答 2

1

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

因此,ZebraPrinterFactory 是一个简单的工厂,它询问打印机连接以确定您拥有的打印机型号(ZPL 或 CPCL)。工厂的返回类型是一个接口,ZebraPrinter. a 的具体类型ZebraPrinter是内部的、未记录的类,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);

希望这可以帮助!

于 2012-06-14T18:20:18.287 回答
0

代替:

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

利用:

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

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

于 2012-06-13T12:19:15.253 回答