C++/CLI 托管C++之联合体union封装【10】

CLI封装Union时,没有对应的类型,使用的是结构体struct,指定每个元素的偏移位置。

【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

时间: 2024-08-11 09:45:01

C++/CLI 托管C++之联合体union封装【10】的相关文章

C++/CLI 托管C++之结构体封装(内存对齐#pragma pack)【9】

CLI封装涉及内存对齐的结构体时,使用的是StructLayoutAttribute,指定Pack为1.4.8等属性. [1]C++导出函数,使用 1位对齐 #pragma pack(push) #pragma pack(1) typedef struct _testStru2 { int iVal; char cVal; __int64 llVal; }testStru2; #pragma pack(pop) //4.2 结构体边界对齐 EXPORTDLL_CLASS void Struct_

C++/CLI 托管C++之类、属性封装【7】

CLI封装类时,涉及确定性析构与非确定性析构,属性封装使用property. [1]C++导出类 class EXPORTDLL_CLASS CAddSub { public: CAddSub(){ m_len = 0; } ~CAddSub(){ } public: int Add(int x, int y){ return x+y; } int Sub(int x, int y){ return x-y; } int GetLength() { return(m_len); } void S

联合体union的详解

1.概述 联合体union的定义方式与结构体一样,但是二者有根本区别. 在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和.而在"联合"中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度. 2.联合体长度 在The C Programming Language里面讲述union内存分配的原话是 1)联合体就是一个结构 2)联合体的所有成员相对于基地址的偏移量为0 3)此结构空间要大到总够容纳最"宽"的成员 4)并且,其对其方式要适

联合体union用在何处?

程序设计刚開始学习的人在学习时,总想问:"这个东东有什么用?"于是,在建设有关的教学资源时,也便总从这个角度,试图给出一些案例.这是一个将刚開始学习的人作为教学目标人群的人该干的事. 然而,在准备这样一些案例时,诸如循环.数组.结构体之类的,能够编出一堆堆的能体现实际应用的案例,或出例题,或出实践题目,都好说.然而.对于有些在教科书中的"小知识点",作为讲程序设计语言,有些老师都选择不讲的,能却总是不易编出. 基本的原因,是这些内容要解决的问题.似乎并不常见.针对特

C++/CLI 托管C++之导出注释【11】

将封装好的CLI Dll提供给NET使用时,当然少不了注释的添加.本文就是介绍使用XML注释的方式,获取Dll对应的注释.涉及两点: [1]CLI的成员的注释需要按照标准的方式进行添加,简单点就是C#怎样添加注释///, CLI也要按照同样的方式添加,如下图: /// <summary> /// 1 字符串测试类 /// </summary> public ref class StrCls { public: /// <summary> /// 1.1 字符串作为输入参

C++/CLI 托管C++的数组介绍【4】

托管数组实际是System::Array 类型的对象,因此在 C++/CLI 程序中创建的托管数组能使用该类提供的各种方法和属性. [1] 定义  [qualifiers] [cli::]array<[qualifiers]type[,dimension]> ^var; qualifiers  存储方式说明(可选项).可选择的存储方式包括:mutable, volatile,const,extern和 statc. array 托管数组定义的关键字,该关键字是定义在cli 名 域中的.托管程序

C++/CLI 托管C++的数据类型介绍【2】

CLI: 公共语言基础构造(Common Language Infrastructure),是由ECMA(欧洲计算机制造商协会)成立专家组,并结合ISO 标准.开发形成的一个可扩展语言标准. C++/CLI目的是把C++带到CLI平台上,使C++能够在CLI平台上发挥最大的能力,而并非把C++约束在CLI平台(CLI本身也是 ISO标准化的)上.相反,原来标准C++的能力丝毫没有减弱,并且,通过C++/CLI中的标准扩展,C++具有了原来没有的一系列 的.NET特性以及动态编程能力.这些扩展并非

C++/CLI 托管C++的基本数据类型及函数【3】

在 C++/CLI 扩展中提供了基元数据类型的别名,这些别名与 C++中提供的内置数据类型名相同. 提供的主要基元数据类型与(C++/CLI 类型)别名如下: 基元数据类型 C++/CLI 类型 说明 Boolean bool 布尔类型 Byte char 8位无符号整数 SByte signed char 8 位有符号整数 Char __wchar_t 16位Unicode 字符类型 Int16 short 16位有符号整数 UInt16 unsigned short 16 位无符号整数 In

结构体,联合体union,枚举,sizeof

结构体中的位字段 有些信息在存储时并不需要占用一个完整的字节,有时只需要占用一个或者几个二进制位,为了节省存储空间并使得处理简便,C语言提供了一种数据结构,成为“位域”或者“位段”. C与C++允许指定占用特定位数的结构成员,字段的类型应为整型或者枚举型 ,接下来是冒号:,然后后面跟一个数字,它指定了使用的位数,且可以使用没有名字的字段来提供间距.每个成员都被称为位字段(bit field).例: 1 struct reg 2 { 3 unsigned int SN:4; 4 unsigned