2

私は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をファクトリクラスによって返されるものにマップできないということでしょうか?

4

2 に答える 2

1

私はMonoTouchに精通していませんが、ゼブラAPIについては知っています。うまくいけば、SDKが機能する方法の背景がこれらのモノマッピングに役立つでしょう

したがって、ZebraPrinterFactoryは、プリンタ接続を調べて、使用しているプリンタのモデル(ZPLまたはCPCL)を特定する単純なファクトリです。ファクトリのリターンタイプはインターフェイスですZebraPrinter。aの具体的なタイプZebraPrinterは、内部の文書化されていないクラス、ZebraPrinterZplまたはZebraPrinterCpclです。これらの具象クラスは両方ともZebraPrinterインターフェースに準拠しており、プリンターで機能を実行できます。プリンターの言語について知る必要性を抽象化するために、これを行うことにしました。ただし、Monoがマッピングを実行するために具象クラスについて知る必要がある場合は、具象クラスにリターンをキャストできます。ZebraPrinterCpclまたはZebraPrinterZpl(プリンターモデルによっては、小型のモバイルプリンターはおそらく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 に答える