2

バイト配列を構造体型に変換する必要があります。これを行うには、デスクトップ プロジェクト アプリケーションに次のコードを使用します。

var str = new SFHeader();
int size = Marshal.SizeOf(str);

IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
Marshal.FreeHGlobal(ptr);

return str;

SFHeader私の構造はどこにありますか。

問題は、次の行です。

str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));

NotSupportedExceptionこのコードをスマート デバイス プロジェクトから実行すると、 がスローされます。Compact Framework でこの作業を行う他の方法はありますか?

[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{

    internal const int MAX_FILENAME_LENGTH = 32;


    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
    public string FileName;

    public int Offset;

    public short Size;

    public byte Flags;

    public byte Source;

    public long LastWriteTime;

}
4

1 に答える 1

2

Marshal.PtrToStructure は機能し、コンパクトなフレームワークで何度も使用しました。正しく使用しているようです。したがって、問題は構造体の定義にあるはずです (構造体の CF でサポートされていないものがある可能性があります)。

次のコードは、Windows CE 5.0 および .NET CF 3.5 を使用している私のデバイスで問題なく動作します。

[StructLayout(LayoutKind.Sequential)]
    public struct SFHeader
    {
        internal const int MAX_FILENAME_LENGTH = 32;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
        public string FileName;
        public int Offset;
        public short Size;
        public byte Flags;
        public byte Source;
        public long LastWriteTime;
    }

    private static void Test()
    {
        var str = new SFHeader();
        int size = Marshal.SizeOf(str);
        byte[] buffer = new byte[size];

        IntPtr ptr = Marshal.AllocHGlobal(size);
        Marshal.Copy(buffer, 0, ptr, size);
        str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
        Marshal.FreeHGlobal(ptr);
    }

.NET Compact Framework のマーシャリング構造のガイドラインに従っていることを確認します。

もう 1 つのオプションは、フィールドをバッファから構造体に手動で 1 バイトずつコピーすることです。SFHeader を返し、byte[] を取る関数を作成できます。

于 2012-11-16T15:03:28.533 に答える