Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Tip

C# ↔ C++의 이기종 통신을 위한 마샬링에 대해서 살펴보겠습니다.

여기서 언급되는 컨셉은 JAVA ↔ C# , JAVA ↔ C++ 등으로 확장될수도 있습니다.

실제로 프로젝트에 활용하기 위해 작성하였으며, 아직도 이러한 방식으로 운영되고 있습니다.




Code Block
languagec#
themeEmacs
titleC# Base Class
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices; //관리되지않는 코드 (포인터 사용및 구조체를 시퀜셜하게 만들기위해)
using System.Web.Script.Serialization;
 
[StructLayout(LayoutKind.Sequential, Pack = 1)] // #pragma pack(1) 과 동일한 효과..
    public class ConvertPacket
    {
        // 받은 패킷 바이트를 구조체화함
        public void SetBuffer(byte[] pbyte)
        {
            unsafe	// c#에서는 포인터연산을 통한 메모리복사를 안전하지 않는 코드로 판단, unsafe블록안에 감싸줘야함
            {
                try
                {                    
                    fixed (byte* fixed_buffer = pbyte)
                    {
                        Marshal.PtrToStructure((IntPtr)fixed_buffer, this);                       
                    }                    
                }
                catch (Exception e)
                {                    
                    LogUtil.Instance.writeLog(LOGLEVELTYPE.WARN, "SYSTEM", "LSSOCK", string.Format("ParserError {0} - {1}", e.Message, e.Source) , "ConvertPacket::SetBuffer");
                }
            }
        }
 
        // 보낼패킷 구조체를 byte에 복사함
        public void PutBuffer(byte[] pbyte)
        {
            int mycount = Marshal.SizeOf(this);
 
            unsafe
            {
                fixed (byte* fixed_buffer = pbyte)
                {
                    Marshal.StructureToPtr(this, (IntPtr)fixed_buffer, true);                    
                    for (int i = 0; i < mycount; i++)
                    {
                        pbyte[i] = fixed_buffer[i];
                    }
                }
            }
        }
 
        public int GetSize()
        {
            return Marshal.SizeOf(this);
        }
 
        public byte[] GetBuffer()
        {
            byte[] resultObj = new byte[ GetSize() ];
            PutBuffer( resultObj );
            return resultObj;
        }
 
        public override string ToString()  //이것은 디버깅을위해 패킷을 까보는 활동의 코드입니다.
        {
            return new JavaScriptSerializer().Serialize(this);
        }
    }

...