//C++ Union 在C#中的使用,需要注意的是:#没有union,而且对象类型不能和非对象类型对齐,而union中所有
变量偏移量是相同的,都是0。
//C++
union Myunion
{
int number;
double d;
}
union MyUnion2
{
int i;
char str[128];
};
//C# 由于MyUnion2 有两种不同类型,所以封送成两个结构,函数调用时也重载两个函数,参数分别对应同的结
构
[structLayout(LayoutKind.Explicit)]
public struct MyUnion
{
[FieldOffset(0)]
public int i;
[FileOffset(0)]
public double d;
}
[StructLayout(LayoutKind.Explicit,Size=128)]
public struct MyUnion2_1
{
[FileOffset(0)]
public int i;
}
[StructLayout(LayoutKind.Sequential)]
public struct MyUnion2_2
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst =128)]
public String str;
}
public class LibWrap
{
[DllImport("..\LIB\PinvokeLib.dll")]
public static extern void TestUnion(MyUinon u, int type);
[DllImport("..\LIB\PinvokeLib.dll")]
public static extern void TestUnion2(MyUnion2_1 u, int type);
[DllImport("..\LIB\PinvokeLib.dll")]
public static extern void TestUnion2(MyUnion2_2 u, int type); //此处重载了哦
}
//测试
public class AppTest
{
public static void Main()
{
MyUnion mu = new MyUnion();
mu.i =999;
LibWarp.TestUnion(mu,1);
mu.d=999.999;
LibWarp.TestUnion(mu,2);
MyUnion2_1 mu2_1 =new MyUnion2_1();
mu2_1.i =999;
LibWrap.TestUnion2(mu2_1,1);
MyUnion2_2 mu2_2 = new MyUnion2_2();
mu2_2.str = "hello world ";
LibWrap.TestUnion2(mu2_2,2);
}
}
//////////////////////////////////////////////////////////////
//看看这个结构体 C++
typedef struct tagRCV_DATA
{
int m_wDataType;
int m_nPacketNum;
RCV_FILE_HEADEx m_File; //这是一个结构体
union //这里用了内联
{
RCV_REPORT_STRUCTEx_3 * m_pReport3; //RCV_REPORT_STRUCTEx_3 是结构体
RCV_HISTORY_STRUCTEx * m_pDay; //RCV_HISTORY_STRUCTEx是 结构体
RCV_MINUTE_STRUCTEx * m_pMinute; //RCV_MINUTE_STRUCTEx是结构体
void * m_pData; //空类型的指针
};
} RCV_DATA;
//C#
[StructLayout( LayoutKind.Sequential)]
public struct tagRCV_DATA
{
public int m_wDataType;
public int m_nPacketNum;
[MarshalAs(UnmanagedType.Struct)]
public tagRCV_FILE_HEADEx m_File;
public bool m_bDISK;
[StructLayout( LayoutKind.Explicit,Size=144)]
public struct StockData
{
[FieldOffset( 0 )]
public IntPtr m_pReport3; //指向tagRCV_REPORT_STRUCTEx的指针
[FieldOffset( 0 )]
public IntPtr m_pDay; //指向 tagRCV_HISTORY_STRUCTEx 的指针
[FieldOffset( 0 )]
public IntPtr m_pMinute; //指向 tagRCV_MINUTE_STRUCTEx 的指针
[FieldOffset( 0 )]
public IntPtr m_pData;//空指针
}
public StockData stockdata; //嵌套结构体类型哦
}