2010-12-28 10 views
3

私はcで書かれたdllを使用しています。私は私のC#プログラムに必要なすべての機能をインポートしました。機能のほとんどは正しく動作することができますが、いくつかの問題を抱えています。私が問題を抱えている関数は、入力として構造体が必要です。私はC#でこの構造体を定義する必要があると想定していますが、これはやっていますが、私は自分自身を混乱させ始めているので、私は試行したものを残します。構造体にはかなり長いので、私はそれをC言語でのように見えるだけで何の意志である:dllからc structをc#に変換する

typedef struct chain_link_info 
{ 
    unsigned short command; 
    unsigned long* buff_id; 
    FLAGS_TYPES flags; // this is a union that i will list below 
} CHAIN_LINK_INFO; 

typedef union flags_type 
{ 
    unsigned long ulong; 

    struct 
    { 
    unsigned short std_flags; 
    unsigned short high 
    } ushort; 

    struct 
    { 
    unsigned int a : 1; 
    unsinged int b : 1; 
    unsinged int c : 1; 
    unsinged int d : 1; 
    unsinged int e : 2; 
    unsinged int f : 1; 
    unsinged int g : 1; 
    unsinged int h : 1; 
    unsinged int i : 1; 
    unsinged int j : 1; 
    unsinged int k : 1; 
    unsinged int l : 1; 
    unsinged int m : 1; 
    unsinged int n : 1; 
    unsinged int o : 1; 
    unsigned int high_word :16 
    } std_bits; 
} FLAGS_TYPE; 

C#でこれらstuctsを定義するための適切な方法は何ですか?

+1

私はこれが[StructLayout](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx)が再生するためには来るが、ポジティブ。 –

+0

申し訳ありませんがdownvote、私はそれを削除しました。偶然にそれをクリックしている必要があります。私は、組合がどのようにマッピングされているのだろうか不思議です。 –

答えて

1

C#構造体を作成し、[StructLayout]を適用し、Cと同じ順序でフィールドをリストします。FLAGS_TYPE構造体では、フィールドに[FieldOffset]属性を使用する必要があります。共用体のすべてのメンバは同じメモリアドレスから開始するので、同じ[FieldOffset(0)]をそれらに適用します。

UPDATE:これでフォーマットされたので、あなたは組合をまったく使用する必要はないと思います。単一の32ビット整数を使用し、ビット単位の操作で異なるフィールドを取得すると、より安全です。

+0

ええ、質問は "Cで構造を定義する正しい方法は何ですか?" ;-) –

1

Cの宣言が有効でないため、適切な答えを得ることが難しくなります。通常はビットフィールドを扱うことはできませんが、この特殊なケースではすべてが8ビットの倍数であるため動作します。 [StructLayout(LayoutKind.Explicit)]が必要で、各フィールドに[FieldOffset(x)]を使用します。不正な名前のunsigned long、std_flagsおよびaはオフセット0にあります。bは1でhighとhigh_wordです。

+0

私は謝罪します。私は実際の構造体のようにもう少し質問を修正しました。元の支柱はかなり大きいので、私はちょうどそれらを整えようとしています。単純な答えが私が間違っていることを見る助けになることを望みます。ありがとうございました。 – poco

+0

ビットフィールドはもはや8の倍数ではなくなりました。&と|を使う必要があります。個々のビットを取得/設定したい場合は演算子を使用します。 –

0

FieldOffsetはバイト単位です。 したがって、FieldOffsetまではバイトまでしか表現できません。 独自のFieldOffsetを作成することもできます。

関連する問題