.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(默认值)、SequentialExplicit

在 .NET Compact Framework 中,Auto 等效于 Sequential

指定了 Explicit 值后,必须对所有字段应用 FieldOffsetAttribute 属性。字节值必须在类型的边界内。例如,2 字节整数必须只能在偶数地址上开始,4 字节整数必须在能被 4 整除的地址上开始,依此类推。

请注意,不支持 StructLayoutAttribute.Pack 字段。

请参见

其他资源

.NET Compact Framework 中的封送处理支持