当你调用非托管程序集中的代码(C/C++)时,才会用到(比如调用Win32 API, COM) 当托管类型和非托管类型在内存结构上完全对应时,两边都可以直接使用时,而不用作任何封装转换,这个类型就是Blittable, 比如int32, byte...
p_invoke调用的返回类型必须是Blittable类型。
System下的Blittable类型 |
---|
System.Byte |
System.SByte |
System.Int16 |
System.UInt16 |
System.Int32 |
System.UInt32 |
System.Int64 |
System.UInt64 |
System.IntPtr |
System.UIntPtr |
System.Single |
System.Double |
- 在混合编程中,
GCHandle
的Alloc
函数的第二个参数如果是GCHandleType::pinned
的时候,被"钉"住的对象如果包含非Blittable类型的时候,则会抛出异常,只能是Blittable的类型才能被"钉"住。但对象本身可以是non-Blittable类型,但数据成员只要没有non-Blittable类型就可以。 - 委托是引用静态方法或类实例的数据结构,不是Blittable。
下面的都不是Blittable类型的
None Blittable | 描述 |
---|---|
System.Array | 转换为C样式数组或SAFEARRAY |
System.Bool | Converts to a 1, 2, or 4-byte value with true as 1 or -1 |
System.Char | 转换为Unicode或ANSI字符 |
System.Class | 转换为类接口 |
System.Object | 转换为变体或接口 |
System.Mdarray | 转换为C样式数组或SAFEARRAY |
System.String | 转换为以空引用结尾的字符串或BSTR |
System.Valuetype | 转换为具有固定内存布局的结构 |
System.Szarray | 转换为C样式数组或SAFEARRAY |
虽然System.Char和wchar_t对应,但不是Blittable类型。
网友评论