私は以下の入れ子構造を持っています。私はこのような構造にバイト配列をコピーする必要があるので、私は、次のC#ネストされた構造マーシャリング - オブジェクト
vcpBuffer = new VCP_DATA();
GCHandle handle = GCHandle.Alloc(vcpBuffer, GCHandleType.Pinned);
try
{
IntPtr pBuffer = handle.AddrOfPinnedObject();
Marshal.Copy(bytarray, 0, pBuffer, length);
}
finally
{
if (handle.IsAllocated)
handle.Free();
}
しかしGCHandle.Alloc()は、「タイプSystem.Argument.Execptionの未処理の例外がエラーを返してみました
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ERROR_ITEM
{
byte ErrorID;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ERROR_DATA
{
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 10)]
ERROR_ITEM[] ErrorItem;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct VCP_DATA
{
[MarshalAs(UnmanagedType.Struct)]
ERROR_DATA ErrorData;
};
"mscorlib.dllで発生しました。 追加情報:オブジェクトには、プリミティブでないデータまたはblittable以外のデータが含まれています。
ありがとうございます。彼らは働くと確信していますが、私は必要なことをする別の方法を見つけました。 vcpBuffer =新しいVCP_DATA(); GCHandleハンドル= GCHandle.Alloc(bytearray、GCHandleType.Pinned); \t try { IntPtr pBuffer = handle.AddrOfPinnedObject(); vcpBuffer =(VCP_DATA)Marshal.PtrToStructure(pBuffer、typeof(VCP_DATA)); (ハンドル.IsAllocated) handle.Free(); } – Hassan
@ハッサン - あなたはそれを答えて受け入れるべきです!それは正当なものであり、サイトを改善するものです。 – hoodaticus