2011-11-01 15 views
8

:これはCS1663になります固定サイズ配列どのように私はC#で構造タイプの固定サイズの配列を宣言します

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

:構造体型の固定サイズバッファが許可されていない、私はどのように行いますこの問題を回避するには、C#または "Managed Collectionのデータ構造"型を使用しないことをお勧めします。これは、ネイティブC++に頻繁にマーシャリングする必要があるためです。

答えて

9

なければならないということですstructはプリミティブデータ型のみを使用し、C++のネイティブ構造体とまったく同じレイアウトを持ちます。これらの制限を手動メモリで回避できますm管理と安全でないコード。ボーナスとして、マーシャリングを避けてパフォーマンスを向上させます。

メモリを割り当て:

IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256); 

これは基本的にmallocので、割り当てられたメモリは、GCの意識外です。

IntPtrをMyStruct[256]のようにネイティブコードに渡すことができ、IntPtrのみがマーシャリングされ、メモリは指し示されません。ネイティブコードとマネージコードは同じメモリに直接アクセスできます。あなたがfreeに、メモリを完了したら

static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    return *ptr; 
} 

static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    *ptr = value; 
} 

Marshal.FreeHGlobal (arr); 

に忘れてはいけない:、Cの#で配列の構造体を作成し、C#のポインタを使用して読み取り/

それ。

3

できません。 per the definition

唯一の制限は、配列型は、あなたのC#の場合boolbytecharshortintlongsbyteushortuintulongfloat、またはdouble.

+0

回避策はありませんか?私はC++のようにこれを行うことができますか? – uray

+0

@uray私が示唆できるのは、通常の配列だけです。それができないのなら、... –

関連する問題