封送处理概述

更新:2007 年 11 月

.NET Compact Framework 2.0 版通过 IDispatch 以及平台调用和 vtable 调用提供了扩展的封送处理支持。这种支持包括:

  • 使用 MarshalAsAttribute 属性。

  • 封送 Windows Embedded CE 上支持的变量类型。

  • 封送通过 vtable 调用 COM 接口的类型。

  • 封送带有嵌入的数组和字符串的结构。

  • 指定结构的布局。

可通过值或通过引用封送下列类型:

  • BStr

  • IUnknown

  • IDispatch

  • SafeArray

  • DateTime(作为 OLE DATE 封送)

  • Variant

请注意,.NET Compact Framework 2.0 支持 AllocHGlobalFreeHGlobal 方法。

互操作日志记录

可创建函数签名的日志文件以了解互操作调用是如何封送的。有关如何创建这些文件的信息,请参见如何:创建日志文件。有关如何解释日志文件的信息,请参见日志文件信息

与 .NET Framework 全功能版的封送处理之间的差异

.NET Compact Framework 不支持 .NET Framework 全功能版中提供的下列封送处理和互操作性功能:

  • 自定义封送处理。

  • 使用 GetDelegateForFunctionPointer 方法从本机函数指针获取托管委托。然而,您可以从托管委托创建本机函数指针。

  • 从本机组件访问 .NET Compact Framework 类。

  • 通过 IDispatch 传递结构 (VT_RECORD)。

  • 通过 IDispatch 传递 Int64 和 UInt64 类型。

.NET Compact Framework 与 .NET Framework 全功能版在下列封送处理行为中存在差异:

  • .NET Compact Framework 允许封送 SCODE 值的数组,但 .NET Framework 全功能版却不允许。

  • .NET Compact Framework 封送 IUnknown 和 IDispatch 指针数组的方式不同于 .NET Framework 全功能版。

  • .NET Compact Framework 将所有线程作为多线程单元初始化,并且不支持其他线程模型或设置单元模型。因此,.NET Compact Framework 不支持 ApartmentState 属性或下列方法:

以 Visual Basic Declare 语句进行封送处理

Visual Basic Declare 语句是在 DLL 中对外部过程进行 declare 引用的替代方法。注意 Declare 语句中的 Ansi 关键字不受支持。

除了 ByVal String 对象外,使用 Declare 语句与使用 DllImportAttribute 类的封送效果是相同的。在 Declare 语句中,ByVal String 参数将作为输出参数加以封送。由于字符串是不变的,因此这会强制公共语言运行库复制字符串并返回新的引用。

IDispatch 和平台调用封送拆收器之间的差异

下表列出了两种封送拆收器以不同的方式进行封送的类型。

类型

IDispatch

平台调用和 vtable

String

BStr

wchar*

Object

Variant

NULL

Boolean

VARIANT_BOOL

byte

Array

SafeArray

C 样式数组

.NET Compact Framework 通过不含 StructLayoutAttribute 的平台调用将类封送为自动布局结构;而 .NET Framework 全功能版则将其封送为 COM 可调用包装 (CCW)。

请注意,.NET Compact Framework 用 FADF_FIXEDSIZE 标记 SafeArray,如果在本机代码中调整其大小,则会引发异常。

Boolean 转换为本机字节类型时,不能将 Boolean 封送为返回类型,而只能将其封送为参数。

封送委托

默认情况下,委托是作为函数指针封送的。也可以显式地使用来自 UnmanagedType 枚举的 FunctionPtr 值以创建 MarshalAsAttribute 的实例。请参见将委托封送处理为函数指针中的示例。

指定字符集

在通过平台调用封送字符串时,可使用 DllImportAttributeCharSet 字段指定字符集。

.NET Compact Framework 支持下面两个值:

  • Auto. 字符串使用操作系统上相应的字符集(即 Unicode 字符集)进行封送。这是默认值。

  • Unicode. 字符串使用 Unicode 字符集进行封送。

Ansi 值不受支持,因为 Windows Embedded CE 只支持 Unicode。None 等效于 Ansi,因而也不受支持。

由于 .NET Compact Framework 不支持 ExactSpelling 字段,因此公共语言运行库会根据由 CharSet 指定的值自动搜索入口点。

对象固定

当 .NET Compact Framework 公共语言运行库封送对象时,该对象将在平台 invoke 调用期间被固定,以确保垃圾回收器不会释放或移动该对象。

内存使用

在 .NET Compact Framework 中处理非托管代码的内存时,请遵循以下原则:

  • 始终在托管代码中分配内存并将其传递给非托管代码。

  • 如果非托管代码含有指向托管组件的指针,必须使用 GCHandle 结构手动固定对象。

.NET Compact Framework 公共语言运行库在启动时同时初始化各个线程,并在关闭时同时取消初始化这些线程。这些线程被标记为“自由线程”。

请参见

任务

如何:创建日志文件

概念

日志文件信息

其他资源

.NET Compact Framework 中的互操作性