|
分類:[.NET 全般]
以下のような構造体Fをマーシャリングしたいのですが、
fixed配列aが期待通りマーシャリングされません。
なぜこのような現象になるのでしょうか?
fixed配列ではなく、普通の配列にしてMarshalAs属性を付けるとか、
bを消すとかすると正しくマーシャリングされるのですが、
fixed配列のまま、正しくマーシャリングするにはどうすればよいのでしょうか?
(.net 4.0, xp 32bit)
using System;
using System.Runtime.InteropServices;
unsafe class Program
{
struct F
{
public fixed byte a[2];
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
//public byte[] a;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
public string b;
}
static void Main()
{
var buf = new byte[] { 1, 2, 65, 66, 0 };
fixed (byte* p = buf)
{
F f = (F)Marshal.PtrToStructure((IntPtr)p, typeof(F));
Console.WriteLine("{0} {1}", f.a[0], f.a[1]); //1 2でなく、1 0になるのはなぜ?
Console.WriteLine(f.b); //AB
}
}
}
|