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