WEB开发网
开发学院软件开发C语言 c#编程指南(十三) 平台调用P-INVOKE完全掌握, 结构... 阅读

c#编程指南(十三) 平台调用P-INVOKE完全掌握, 结构体和结构体指针

 2010-09-30 22:46:05 来源:WEB开发网   
核心提示:这篇讲关于结构体和结构体指针的P-INVOKE,关键有4个P-INVOKE类型,c#编程指南(十三) 平台调用P-INVOKE完全掌握, 结构体和结构体指针,结构体作为输入输出参数,结构体指针作为输入输出参数,看下面,这里提到一点C# 声明结构体中的成员是数组的必须像下面那样声明:使用[MarshalAs(Unmana

这篇讲关于结构体和结构体指针的P-INVOKE,关键有4个P-INVOKE类型,结构体作为输入输出参数。结构体指针作为输入输出参数。还有结构体内的成员类型分为:数组,指针,指针数组,结构体,结构体指针,结构体数组,结构体指针数组。当然还有类继承(这里只介绍了单继承)。

其中有一个比较费解的是结构体作为返回值的P-INVOKE的奇怪现象,下一篇结合反汇编讲解。

第一:C++结构体和C#结构体对应关系,看下面。这里提到一点C# 声明结构体中的成员是数组的必须像下面那样声明:使用[MarshalAs(UnmanagedType.ByValArray, SizeConst = N)]

C++代码不多,全部贴到这里:

 1 struct Base
 2 {
 3   int BaseInt;
 4 };
 5 
 6  struct Test : Base
 7 {
 8   int TestIntArray[2];
 9   //
10    int * TestIntPointer;
11   int * TestIntPointerArray[2];
12   //
13    Base TestBase;
14   Base * TestBasePoint;
15   Base TestBaseArray[2];
16   Base * TestBasePointerArray[2];
17 };

再来看C#的结构体声明:

 1  [StructLayout(LayoutKind.Sequential)]
 2   public struct Base
 3   {
 4     public int BaseInt;
 5   }
 6 
 7   [StructLayout(LayoutKind.Sequential)]
 8   public struct Test
 9   {
10     public Base _base;//把继承的基类放在第一个元素的位置。
11     //
12      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
13     public int[] TestIntArray;
14     //
15      public IntPtr TestIntPointer;
16     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
17     public IntPtr[] TestIntPointerArray;
18     //
19      public Base TestBase;
20     public IntPtr TestBasePoint;
21     //
22      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
23     public Base[] TestBaseArray;
24     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
25     public IntPtr[] TestBasePointerArray;
26   }
27  

1 2  下一页

Tags:编程 指南 十三

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接