gpt4 book ai didi

Zebra SDK 与 Monotouch 的绑定(bind)?

转载 作者:行者123 更新时间:2023-12-02 03:59:55 26 4
gpt4 key购买 nike

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

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

ZebraPrinterConnection 协议(protocol)由 TcpPrinterConnection 接口(interface)实现。
ZebraPrinterFactory 接口(interface)用于获取 ZebraPrinter 协议(protocol)的实例,需要将 ZebraPrinterConnection 传递给它。

这是绑定(bind)的核心:

斑马打印机连接

header (.h)

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

绑定(bind) (.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

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

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

斑马打印机厂

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

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

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

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

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

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

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

最佳答案

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

因此,ZebraPrinterFactory 是一个简单的工厂,它询问打印机连接以确定您拥有的打印机型号(ZPL 或 CPCL)。工厂的返回类型是一个接口(interface),ZebraPrinter . ZebraPrinter 的具体类型是一个内部的、未记录的类,ZebraPrinterZplZebraPrinterCpcl .这两个具体类都符合 ZebraPrinter接口(interface)并且可以在打印机上执行功能。我们选择这样做是为了消除对打印机语言的了解。但是如果 Mono 需要知 Prop 体类来执行映射,您可以将返回值强制转换为具体类 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);

希望这可以帮助!

关于Zebra SDK 与 Monotouch 的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11008726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com