1

尝试从托管代码调用 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 字节的数字替换它,或者简单地注释掉并将硬编码的大小放入结构属性中 - 一切正常。

4

0 回答 0