マネージコードから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バイトの数値に置き換えるか、単純なコメントアウトしてハードコードされたサイズを構造属性に入れると、すべて正常に機能します。