1

私は次のクラスを持っています

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class xy11Dataset : SZLDataset
{
    public short Index { get; set; }

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    private string _mlfB;
    public string MlfB
    {
        get { return _mlfB; }
        set { _mlfB = value; }
    }

    public UInt16 BGTyp { get; set; }

    public UInt16 Ausbg1 { get; set; }

    public UInt16 Ausbg2 { get; set; }
}

次のコードを入力します。

byte[] objBuffer = new byte[retVal.Size];
Array.Copy(buffer, (n*retVal.Size) + 8, objBuffer, 0, retVal.Size);
GCHandle handle = GCHandle.Alloc(objBuffer, GCHandleType.Pinned);
datsets.Add((xy11Dataset)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(xy11Dataset)));
handle.Free();

objBuffer の位置 2 (文字列の開始位置) に値がありますが、文字列は空のままです!

4

1 に答える 1

3

ここで自動プロパティの使用をあきらめる必要があります。これらは、プロパティと連続していないプライベート バッキング フィールドを生成し、末尾に追加します。ildasm.exe で見ることができます。名前は<Index>k_Backingfield. この式が正しい値を返すようにする必要があります。

        int offs = (int)Marshal.OffsetOf(typeof(xy11Dataset), "_mlfB");

SZLDataSet に何が含まれているかわかりませんが、それがないと、現在 0 が返されます。不正解です。2 が必要です。最善の方法は、レイアウトがバッファー内のデータと完全に一致する public フィールドを持つ構造体を宣言することです。値からクラス オブジェクトを初期化します。

于 2011-01-24T15:46:26.437 に答える