尝试从托管代码调用 DeviceIoControl 函数。有几个这样定义的结构:
[StructLayout(LayoutKind.Explicit)]
public struct PARTITION_INFORMATION_UNION
{
[FieldOffset(0)]
public PARTITION_INFORMATION_MBR Mbr;
[FieldOffset(0)]
public PARTITION_INFORMATION_GPT Gpt;
}
[StructLayout(LayoutKind.Sequential)]
public struct PARTITION_INFORMATION_MBR
{
public byte PartitionType;
public bool BootIndicator;
public bool RecognizedPartition;
public UInt32 HiddenSectors;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PARTITION_INFORMATION_GPT
{
public Guid PartitionType;
public Guid PartitionId;
[MarshalAs(UnmanagedType.U8)]
public UInt64 Attributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
public String Name;
}
如果我在 x86 中构建我的应用程序可以正常工作,但如果为 x64 构建应用程序并显示以下错误消息,则会在运行时失败:
未处理的异常:System.TypeLoadException:无法从程序集“Test,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型 PARTITION_INFORMATION_UNION,因为它包含偏移量 0 处的对象字段,该对象字段不正确地对齐或重叠-对象字段。
知道我在做什么错吗?
更新:据我了解,问题在于 PARTITION_INFORMATION_GPT 中定义的最后一个字符串。如果我用 9 个 8 字节的数字替换它,或者简单地注释掉并将硬编码的大小放入结构属性中 - 一切正常。