ベンダーから提供されたライブラリのヘッダーファイルで定義されている次の構造があります。
typedef struct {
int iLen;
int iType;
int state;
unsigned char data[1200];
} TCardCmdRespond;
それに一致すると思う構造をC#で作成しました。
[StructLayout(LayoutKind.Sequential)]
public struct TCardCmdRespond
{
public int iLen;
public int iType;
public int state;
public byte[] data;
}
ここで指摘すべきことがいくつかあります。unsignedchar配列を何にマップすべきかわかりません。unsigned charはcharにマップする必要があると最初は推測しましたが、C#のcharはUnicodeであるため、機能しないようです。また、バイトにマッピングしてみました。また、長さ1200がマーシャラーにとって重要であるかどうか、重要である場合は、その指定方法もわかりません。
モノタッチアプリには、構造をパラメーターとして受け取る次のメソッドがあります。
[Export("OnRecvData:")]
public void OnRecvData(TCardCmdRespond respond)
{
...
}
このメソッドは、セレクターを介してライブラリーによって呼び出されます。メソッドは問題なく呼び出されます。構造に含まれるデータを見ると問題が発生します。1〜3の範囲にあると予想される場合、数値は非常に高くなります(比較可能なobjective-cコードは、iTypeがこの範囲にあることを示しています)。マーシャラーが解決しなかったエンディアンの問題である場合に備えて、ビットコンバーターを使用してバイト順序を逆にしようとしました。数はまだ多いので、問題は単純なエンディアンを超えていると思います。
char配列からデータを取り出そうとすると、さらに問題が発生します。nullではありませんが、nullチェック以外の方法でアクセスしようとすると、EXC_BAD_ACCESS(SIGABRT)を使用してアプリケーションがクラッシュします。
私の回避策は、このためのラッパーをobjective-cで記述し、代わりに構造をパラメーターに分割することです。次に、それをラップするライブラリを作成し、代わりにそれをバインドします。私のObjective-cスキルはそれほど熱くはありませんが、それは遅いプロセスです。
これをObjective-Cライブラリにまとめることなくこの作業を行う方法はありますか?