C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 150 を表示中)
■87194 / )  固定長配列を含む構造体のマーシャリング
□投稿者/ mbox (3回)-(2018/04/21(Sat) 06:25:18)

分類:[.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
        }
    }
}

返信 編集キー/


管理者用

- Child Tree -