私はMonotouch(5.2.12)でiPadアプリに取り組んでいます。このアプリは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:ソースタイプから宛先タイプにキャストできません」というメッセージが表示されます。実行時...
あなたがほとんどそれを機能させたことを知っているのはひどい気持ちですが、完全ではありません...これをどのように回避しますか?
更新: OK、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をファクトリクラスによって返されるものにマップできないということでしょうか?