我正在开发 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 映射到工厂类返回的东西?