nosee how to deal with it:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconunionssample.asp

解决方案 »

  1.   

    呵呵,小弟刚开始学,没看懂哪位是不是解释一下。[ StructLayout( LayoutKind.Explicit )]//这是在干什么?
    public struct MyUnion 
    {
       [ FieldOffset( 0 )]
       public int i;
       [ FieldOffset( 0 )]
       public double d;             //这里的变量i和d是不是占用的同一片内存空间?
                                    //如果是,而double和int的长度不一样,怎么安排呢?
                                    //FieldOffset(0)中的0表示都从最低位开始吗?这个参数有什么限制吗?
    }
    [ StructLayout( LayoutKind.Explicit, Size=128 )]
    public struct MyUnion2_1 
    {  
       [ FieldOffset( 0 )]
       public int i;
    }
    [ StructLayout( LayoutKind.Sequential )]
    public struct MyUnion2_2 
    {  
       [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )] 
       public String str;
    }
    //这几行又是干什么的那?
    public class LibWrap
    {
       // Declares managed prototypes for unmanaged function.
       [ DllImport( "..\\LIB\\PinvokeLib.dll" )]
       public static extern void TestUnion( MyUnion 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 );
    }
      

  2.   

    应该说除了与Native代码交互的情况以外,没有太多必要使用union。为了节省一点内存导致程序更复杂不是很有必要。使用StructLayout标出的类型也只是在P/Invoke(DllImport)的时候CLR才会使用用户指定的布局方式。StructLayout表示这个类型(在与Native交互时)使用用户指定的布局格式。
    FieldOffset表示数据成员在类对象布局中的偏移量。