我已经定义了以下结构来模拟C++联合(最终将用于C++ Interop):
[StructLayout(LayoutKind.Sequential)]
internal struct STRUCT1
{
public Guid guid;
public String str1;
public String str2;
}
[StructLayout(LayoutKind.Sequential)]
internal struct STRUCT2
{
public Guid guid;
public String str1;
public String str2;
public Int32 i1;
}
[StructLayout(LayoutKind.Explicit)]
internal struct MASTER_STRUCT_UNION
{
[FieldOffset(0)]
public STRUCT1 Struct1;
[FieldOffset(0)]
public STRUCT2 Struct2;
}
[StructLayout(LayoutKind.Sequential)]
internal struct MASTER_STRUCT
{
public MASTER_STRUCT_UNION Union;
}
Run Code Online (Sandbox Code Playgroud)
我编写了以下测试代码,它将值分配给Struct1.guid并测试相等性Struct2.guid:
class Class1
{
public static void Test()
{
MASTER_STRUCT ms = new MASTER_STRUCT();
bool match;
ms.Union.Struct1.guid = new Guid(0xffeeddcc, 0xbbaa, 0x9988, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0);
Console.WriteLine("Struct1.guid:\t\t{0}\n", ms.Union.Struct1.guid.ToString());
Console.WriteLine("Struct2.integer:\t{0:x}", ms.Union.Struct2.i1);
Console.WriteLine("Struct2.guid:\t\t{0}", ms.Union.Struct2.guid.ToString());
match = ms.Union.Struct1.guid == ms.Union.Struct2.guid ? true : false;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不Struct2.guid相等Struct1.guid,相反一段Struct2.guid价值似乎转变为Struct2.integer?所有结构成员IMO似乎都是一致的.
将LayoutKind.Sequential只影响该结构的非托管表示.这是因为该结构包含非blittable类型(即字符串).
如果仅存在blittable类型,LayoutKind.Sequential则将控制托管和非托管表示(引用).
在您的情况下,编译器决定将整数放在托管表示中的两个字符串之前(如果您ms在调试和展开时将鼠标悬停在上面,则可以看到STRUCT2).
您可以修复,通过使用LayoutKind.Explicit两个STRUCT1及STRUCT2,因为Explicit会影响双方blittable和非Blittable型托管和非托管的表示.
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |