다음 중첩 구조가 있습니다.C# 중첩 구조체 마샬링 - 개체
[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;
};
I이 구조 바이트 배열 복사해야하므로 I는 다음
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 처리되지 않은 예외 리턴 시도 "mscorlib.dll에서 발생했습니다. 추가 정보 : 개체에 비 프리미티브 또는 비 블릿 데이터가 포함되어 있습니다.
제안 해 주셔서 감사합니다. 나는 그들이 일할 것이라고 확신하지만, 내가 필요한 것을하는 다른 방법을 발견했다. vcpBuffer = 새 VCP_DATA(); GCHandle handle = GCHandle.Alloc (bytearray, GCHandleType.Pinned); \t 시도 { IntPtr pBuffer = handle.AddrOfPinnedObject(); vcpBuffer = (VCP_DATA) Marshal.PtrToStructure (pBuffer, typeof (VCP_DATA)); } 마침내 { if (handle.IsAllocated) handle.Free(); } – Hassan
@ 하산 - 해답을 만들어 받아 들여야합니다! 그렇게하는 것이 합법적이며 사이트를 향상시킵니다. – hoodaticus