2

ベンダーから提供されたライブラリのヘッダーファイルで定義されている次の構造があります。

  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ライブラリにまとめることなくこの作業を行う方法はありますか?

4

1 に答える 1

2

C#の定義が正しくありません。

Cバージョンには配列用の1200バイトのインラインブロックが含まれていますが、C#バージョンには配列へのポインター(4バイト)が含まれています。

あなたはこれを見ることができます:

http://msdn.microsoft.com/en-us/library/z6cfh6e6.aspx

于 2012-07-11T21:17:50.337 に答える