안녕하세요 j.sieun 입니다.
이번글에는 제가 마샬링에 대해서 공부하면서 알게된 오류를 같이 공유하고자 오류에 대해 작성해보겠습니다.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct datapacket
{
//무조건 short 값으로 32767
public short size;
public short type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public char[] data;
}
제가 이런식으로 구조체를 만들었습니다.
그리고 구조체를 byte [] 로 바꾸고싶어서
public static byte[] Serialize(Object m_datapacket)
{
int datasize = Marshal.SizeOf(m_datapacket);
IntPtr buffer = Marshal.AllocHGlobal(datasize);
Marshal.StructureToPtr(m_datapacket, buffer, false);
byte[] RawData = new byte[datasize];
Marshal.Copy(buffer, RawData, 0, datasize);
Marshal.FreeHGlobal(buffer);
return RawData;
}
이렇게 작성 했는데요 여기서
Marshal.StructureToPtr 여기서 Exception 이 걸렸습니다.
그래서 제가 중단점으로 하나하나 확인해서 봤더니..
IntPtr buffer 여기 사이즈가 8로 고정되어 있었습니다.
제가 buffer 값을 Marshal.AllocHGlobal(datasize); 이렇게 해서 변경하려 했지만
변경이 안됐습니다.
한마디로 C#으로 마샬링을 하면 어느정도 한계가 있는 것을 확인하여 구조체에는 아주 간단한 것들만 집어 넣고
Array.Copy(a,b,c,d,e);
※ 뜻 : a배열의 b부분부터 e까지의 값을 복사한 값을 c배열의 d부터 나열한다.※
위 메서드를 사용하여 데이터 값을 추가적으로 집어넣고 서버로 던져주는 방법을 선택했습니다.
감사합니다.
'c#' 카테고리의 다른 글
C# 메모리문제에 대해서#미해결 (2) | 2017.02.21 |
---|---|
C# AutoResetEvent 를 이용한 쓰레드 제어 (0) | 2016.12.28 |
C++서버 C#클라 패킷 전송 (구조체 변환, 마샬링,object - byte[]) (0) | 2016.07.25 |