P/Invoke的参数封送
我们知道,托管代码与非托管代码存在很大的差异,P/Invoke在传递参数、返回值时需要先在托管类型和非托管类型之间进行转换,这整个过程有个专门术语,就叫做封送(Marshal)。
P/Invoke可以为常规的数据类型进行正确地封送处理,如整型int,字节型byte。这些常规的数据类型被称为blittable 类型,它们在托管代码和非托管代码中具有相同的表示,P/Invoke在对它们进行封送时不需要进行任何特殊处理。因此使用blittable 类型的非托管函数以用相同表示的托管类型导入其定义。假如有一个DLL中的函数的C++签名为:
int DllFunction_1(int index);
按如下方式导入定义:
[DllImport("dllfile.dll")]
public static extern int DllFunction_1(int i);
在这种情况下,P/Invoke不需要进行任何特殊处理,可以正确地进行参数和返回值的封送。
具体blittable 类型包括:
托管代码类型
|
C++代码类型
|
System.Byte
|
unsigned char
|
System.SByte
|
byte
|
System.Int16
|