类型支持
更新:2007 年 11 月
下表描述类型的类别以及将类型从托管上下文封送到非托管上下文的结果。
类型类别
下表对以下几节讨论的类型中的几种类型进行了描述和分类。
类型 |
说明 |
---|---|
值类型 |
值类型直接包含描述的数据,从堆栈中分配值类型的内存。 |
内置值类型 |
Int32、UInt32、Boolean、Single,等等。有关完整列表,请参见 .NET Framework 类库概述。 |
用户定义的值类型 |
从 System.ValueType 派生。在 C# 中,用户定义的值类型是使用 struct 关键字定义的。 |
枚举 |
枚举也是值类型。.NET Framework 中的枚举的基础类型为 Int32。不过,您可以显式定义一个枚举,使之具有其他基础类型。受支持的基础类型可以是除 Char 之外的任何整数基类型。 |
引用类型 |
引用类型存储对堆中分配的对象内存的引用。它们可以是内置的类、用户定义的类、数组、装箱的值类型、委托等。 |
托管类型到非托管类型
下表描述了将托管类型封送到非托管类型的结果。
托管类型 |
非托管类型 |
---|---|
值类型(大于 32 位) |
未修改的。 |
对值类型的引用 |
指向值类型的指针。 |
64 位整数 |
指向值类型数组的指针。 |
浮点型数字 |
浮点型数字。 |
值类型数组 |
指向值类型数组的指针。 |
枚举的基础值类型。 |
|
ANSI 字符串 |
仅当作为字节数组传递时才受支持。 |
指向 Unicode (wchar_t) 字符的空终止数组的指针。非托管代码不应该修改该数组。 |
|
引用类型 |
指向对象的基础数据字段的指针。引用类型始终按顺序封送。您可以只封送包含值类型成员的对象。 |
对引用类型的引用 |
不受支持。 |
引用类型的数组 |
不受支持。 |
委托 |
函数指针 |
指向 Unicode (wchart_t) 字符的空终止数组的指针。非托管代码可以修改该数组。 |
C# 和 Visual Basic 封送处理结果
下表列出了封送拆收器用于托管类型的 C# 和 Visual Basic 类型,其中 Windows CE 是承载非托管代码的操作系统。该表并不全面。
托管代码 C# 类型 |
托管代码 Visual Basic 类型 |
非托管代码 ByVal |
非托管代码 ByRef |
---|---|---|---|
bool |
Boolean |
BYTE |
BYTE * |
int |
Integer |
INT32 |
INT32 * |
short |
Short |
SHORT |
SHORT * |
long |
Long |
LONG |
INT64 * |
char |
Char |
WCHAR |
WCHAR * |
float |
Single |
FLOAT |
FLOAT * |
double |
Double |
DOUBLE |
DOUBLE * |
string |
String |
WCHAR * |
不支持 |
WCHAR * |
不支持 |
||
DATE |
DATE * |
||
int[] |
Integer() |
INT32 *, INT32[] |
不支持 |
变量类型支持
下表列出了 IDispatch 封送拆收器所支持的 VARENUM 枚举中的类型,该封送拆收器用于从托管代码向非托管代码进行封送。在任何情况下,参数和返回值都支持这些类型。不受支持的类型包括那些不适用于变量类型的类型。
支持的类型 |
不受支持的类型 |
---|---|
VT_I2 VT_I4 VT_CY VT_DATE VT_BSTR VT_DISPATCH VT_ERROR VT_BOOL VT_VARIANT VT_UNKNOWN VT_DECIMAL VT_I1 VT_UI1 VT_UI2 VT_UI4 VT_INT VT_UINT VT_ARRAY VT_R8 VT_R4 VT_CF VT_CLSID |
VT_EMPTY VT_NULL VT_I8 VT_UI8 VT_USERDEFINED VT_RECORD VT_SAFEARRAY(使用 VT_ARRAY) VT_PTR VT_HRESULT VT_VOID VT_CARRAY VT_LPSTR(使用 VT_BSTR) VT_LPWSTR(使用 VT_BSTR) VT_FILETIME VT_BLOB VT_STREAM VT_STORAGE VT_STREAMED_OBJECT VT_STORED_OBJECT VT_BLOB_OBJECT VT_VECTOR |