次の方法で共有


.NET Compact Framework での構造体のマーシャリング

更新 : 2007 年 11 月

マーシャリングのために、配列や文字列を構造体に埋め込むことができます。埋め込まれた文字列がマーシャリングされる方法を指定するには、MarshalAsAttribute 属性を使用する必要があります。使用しない場合は、例外がスローされます。

文字列を wchar_t*, にマーシャリングする場合は、次のいずれかの属性を指定すると、Unicode 文字列へのポインタとしてマーシャリングされます。

[MarshalAs(UnmanagedType.LPWStr)]

または

[MarshalAs(UnmanagedType.LPTStr)]

次の表は、配列および文字列をアンマネージ コードからマネージ コードへマーシャリングするための構造体の定義を示しています。一部の例では、MarshalAsAttribute を使用していることに注意してください。

マーシャリングするデータ

アンマネージ構造体 (C++)

マネージ構造体 (C#)

整数の配列

typedef struct _MyStruct
{
  int intArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValArray, 
    SizeConst = 10)]
  int[] intArray;
}

文字の配列

typedef struct _MyStruct
{
  char charArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValArray, 
    SizeConst = 10)]
  char[] charArray;
}

文字の配列から文字列へ

typedef struct _MyStruct
{
  char charArray[10]; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.ByValTStr, 
    SizeConst = 10)]
  String str;
}

文字列へのポインタ

typedef struct _MyStruct
{
  wchar_t *pStr; 
} MyStruct;
struct MyStruct
{
  [MarshalAs(
    UnmanagedType.LPWStr)]
  String str;
}

構造体のレイアウトの指定

StructLayoutAttribute 属性を使用して、プラットフォーム呼び出しマーシャラに対する構造体のレイアウトを指定できます。.NET Compact Framework では、LayoutKind 列挙型値である Auto (既定)、Sequential、および Explicit の 3 つすべてをサポートしています。

.NET Compact Framework では、AutoSequential と同等です。

Explicit 値を指定する場合は、すべてのフィールドに FieldOffsetAttribute 属性を適用する必要があります。バイト値は、型の範囲内である必要があります。たとえば、2 バイト整数は偶数アドレスから開始し、4 バイト整数は 4 で割り切れるアドレスから開始する必要があります。

StructLayoutAttribute.Pack フィールドはサポートされていないことに注意してください。

参照

その他の技術情報

.NET Compact Framework のマーシャリング サポート