C++中的"Union" 转成C#

时间:2022-09-05 16:29:11
//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;    //嵌套结构体类型哦
   
  }