C++/CLI 托管C++之联合体union封装【10】
2015-01-01 16:19
656 查看
CLI封装Union时,没有对应的类型,使用的是结构体struct,指定每个元素的偏移位置。
【1】声明结构体struct时,需要显示指定为Explicit。
【2】每个数据需要使用FieldOffsetAttribute指定偏移位置。
C++导出函数
CLI封装
CLI类声明
C#测试:
可以看到,当给llLocation赋值时,其余iValLower也会自动赋值。
源码:
https://coding.net/u/aoshilangCode/p/CLI/git
【1】声明结构体struct时,需要显示指定为Explicit。
【2】每个数据需要使用FieldOffsetAttribute指定偏移位置。
C++导出函数
typedef union _testStru4 { int iValLower; int iValUpper; struct { __int64 llLocation; }; }testStru4;
//4.4 union类型中含有结构体 EXPORTDLL_CLASS void Struct_Union( testStru4 *pStru ) { if (NULL == pStru) { return; } pStru->llLocation = 1024; wprintf(L"Struct_Union \n"); }
CLI封装
[Serializable] [StructLayoutAttribute(LayoutKind::Explicit)] public ref struct test4 { [FieldOffsetAttribute(0)] Int32 iValLower; [FieldOffsetAttribute(4)] Int32 iValUpper; [FieldOffsetAttribute(0)] Int64 llLocation; void UnmanagedPtr2ManagedStru(IntPtr ptr) { testStru4 *ptStru = static_cast<testStru4 *>(ptr.ToPointer()); if (NULL == ptStru) return; llLocation = ptStru->llLocation; } };
void ExportCLI::StructCls::StructUnion( test4^ %pStru ) { if (pStru == nullptr) { return; } testStru4 strT; strT.llLocation = pStru->llLocation; Struct_Union(&strT); pStru->UnmanagedPtr2ManagedStru(IntPtr(&strT)); }
CLI类声明
/// <summary> /// 3 结构体测试类 /// </summary> public ref class StructCls { public: /// <summary> /// 3.1 结构体作为输入输出参数 /// </summary> /// <param name="pStru">结构体</param> static void StructChange(test1^ %pStru); /// <summary> /// 3.2 结构体边界对齐 /// </summary> /// <param name="pStru">结构体</param> static void StructPackN(test2^ %pStru); /// <summary> /// 3.3 结构体中含有内置数据类型的数组 /// </summary> /// <param name="pStru">结构体</param> static void StructChangeArr(test3^ %pStru); /// <summary> /// 3.4 union类型中含有结构体 /// </summary> /// <param name="pStru">结构体</param> static void StructUnion(test4^ %pStru); /// <summary> /// 3.5 结构体数组作为参数 /// </summary> /// <param name="pStru">结构体数组</param> static void StructStruArr(List<test5^>^ pStru); };
C#测试:
可以看到,当给llLocation赋值时,其余iValLower也会自动赋值。
test4 tStru4 = new test4(); tStru4.llLocation = 44444444444; StructCls.StructUnion(ref tStru4);
源码:
https://coding.net/u/aoshilangCode/p/CLI/git
相关文章推荐
- C++/CLI 托管C++之enum枚举封装【6】
- C++/CLI 托管C++之结构体封装【8】
- C++/CLI 托管C++之字符串封装【5】
- C++/CLI 托管C++之类、属性封装【7】
- C++/CLI 托管C++之结构体封装(内存对齐#pragma pack)【9】
- 从两道经典试题谈C/C++中联合体(union)的使用
- C++/CLI中,托管代码与本机代码销毁顺序
- 从两道经典试题谈C/C++中联合体(union)的使用
- 《转换指南: 将程序从托管扩展C++迁移到C++/CLI》译后记
- 在非托管C++/CLI引用托管对象
- 谈C/C++中联合体(union)的使用
- 经典试题C/C++中联合体(union)的使用
- 转换指南: 将程序从托管扩展 C++ 迁移到 C++/CLI
- C/C++中联合体(union)的使用
- 《转换指南: 将程序从托管扩展C++迁移到C++/CLI》译后记
- 转换指南: 将程序从托管扩展 C++ 迁移到 C++/CLI
- 利用C++/CLI 封装Native C++ 提升.NET web game性能
- 使用c++/CLI实现c++托管与非托管混合编程
- OpenSceneGraph 笔记--C++/CLI写托管Scene类
- 从两道经典试题谈C/C++中联合体(union)的使用