c#

마샬링 구조체[] byte 오류에 대해서

sieunju 2016. 7. 27. 10:41
반응형

안녕하세요 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부터 나열한다.※


위 메서드를 사용하여 데이터 값을 추가적으로 집어넣고 서버로 던져주는 방법을 선택했습니다. 


감사합니다. 




반응형