C#调用C++ 平台调用P/Invoke 结构体--内存对齐方式、union封装【七】
2014-09-20 09:58
465 查看
【1】内存对齐方式
C++代码:
C#代码,指定Pack即可:
测试:
【2】Union中含有结构体
C++代码:
C#代码:定义成Explict,并显示通过FieldOffset指定内存偏移
测试:
C++代码:
#pragma pack(push) #pragma pack(1) typedef struct _testStru2 { int iVal; char cVal; __int64 llVal; }testStru2; #pragma pack(pop)
EXPORTDLL_API void Struct_PackN( testStru2 *pStru ) { if (NULL == pStru) { return; } pStru->iVal = 1; pStru->cVal = 'a'; pStru->llVal = 2; wprintf(L"Struct_PackN \n"); }
C#代码,指定Pack即可:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)] public struct testStru2 { public int iVal; public sbyte cVal; public long llVal; }; [DllImport("ExportDll.dll", CharSet = CharSet.Unicode)] public static extern void Struct_PackN(ref testStru2 pStru);
测试:
CExportDll.testStru2 stru2 = new CExportDll.testStru2(); CExportDll.Struct_PackN(ref stru2);
【2】Union中含有结构体
C++代码:
typedef union _testStru4 { int iValLower; int iValUpper; struct { __int64 llLocation; }; }testStru4;
EXPORTDLL_API void Struct_Union( testStru4 *pStru ) { if (NULL == pStru) { return; } pStru->llLocation = 1024; wprintf(L"Struct_Union \n"); }
C#代码:定义成Explict,并显示通过FieldOffset指定内存偏移
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Unicode)] public struct testStru4 { [FieldOffset(0)] int iValLower; [FieldOffset(4)] int iValUpper; [FieldOffset(0)] long llLocation; }; [DllImport("ExportDll.dll", CharSet = CharSet.Unicode)] public static extern void Struct_Union(ref testStru4 pStru);
测试:
CExportDll.testStru4 stru4 = new CExportDll.testStru4(); CExportDll.Struct_Union(ref stru4);
相关文章推荐
- c#编程指南(十二) 平台调用P-INVOKE完全掌握, 结构体边界对齐和内存布局
- C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】
- 平台调用P-INVOKE完全掌握, 结构体边界对齐和内存布局
- C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】
- C#调用C++ 平台调用P/Invoke 结构体--结构体嵌套【八】
- C#调用C/C++动态库,封装各种复杂结构体。
- C#调用C++ 平台调用P/Invoke 函数指针/回调函数【二】
- 关于C#调用C++动态库中的内存对齐的讲解
- C++导出函数,C++Invoke再次封装,C#调用
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- c#编程指南——平台调用P-INVOKE完全掌握,C#和C++互相调用
- C# 发中调用一个采用C++封装好的dll, 其结构体中的二维数转换
- C#调用C++ 平台调用P/Invoke 错误码LastError【四】
- 结构体变量对齐的理解,不同的对齐方式,造成不同的内存划分,从而满足不同平台的读写效率.
- C#调用C++ 平台调用P/Invoke 调用约定【一】
- C#调用C++ 平台调用P/Invoke 字符串【三】
- 平台调用 4000 P-INVOKE完全掌握,C#和C++互相调用
- C#调用C/C++动态库,封装各种复杂结构体
- C#调用c++的dll,结构体数组作为引用参数的传递方式
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小