呵呵,小弟刚开始学,没看懂哪位是不是解释一下。[ 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 ); }
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 );
}
FieldOffset表示数据成员在类对象布局中的偏移量。