posted by 방랑군 2012. 1. 21. 22:36

출처 :  http://jafm00n.tistory.com/40 

비관리 코드의 함수를 호출하기 위한, P/Invoke, 내보낸 함수의 프로토 타입을 정의할때면 매개변수로 넘겨 지거나 반환값으로 넘어오는 자료형들이 관리 코드의 자료형과 어울리지 않아 다소 혼란 스럽다. 그래서  플랫폼 호출 데이터 형식 에 맞게 자료형(LPTSTR의 경우 System.String으로)을 대입시켜 줘야 한다.

   그러나 그 외의 구조체, 구조체 포인터, 배열, 문자열의 다양한 형태등은 어떻게 대입시켜야 하는가? 이러한 형식들에 대해서는 특성과 자료형으로 잘 정리하여 적절한 구조를 만들어 대입시켜야 한다. 이러한 작업을 마샬링이라고 한다. 마샬링이라는 문자에 대한 이해 보다는 직접 코딩을 해서 그 자체를 이해 하는 것이 바람직하다고 생각한다.

  또한 비관리 코드로 전달되는 매개 변수에 대한 (In 혹은 Out과 같은) 방향 특성에 대한 설정은 어떻게 해야 하는지 고민해 봐야 할 것이다. 이에 대해서는 방향 특성을 참고 하기 바란다.
 

값으로

 

결과로

 

참조로

 

구조체에서 값으로

 

구조체에서 참조로(char*)

 

구조체에서 참조로(char[])

 

클래스에서 값으로(char*)

 

클래스에서 값으로(char[])

 

윽... 잠이 와서 도저히 못쓰겠다.{=,.=} ㅋ 공란은 내일 쓰기로 하고 ... 이만 자야 겠다.(2009-07-08 AM 3:24)

  ㅋㅋ 포스트를 쓰는데 장장 3일이 걸린것 같다. 나름 깔끔하게 정리하려고 노력 하였으나 지루해지고 고단해 지고 나른한 관계로 중간 중간에 무의 불 성실 하게 글을 올린 듯 하지만 ㅡㅡ;; 이렇게 까지 한 나 자신의 노고를 스스로 치하하는 바이다~ 끝~ (2009-07-09 PM 5:50)

------------------------------------------------------------------------------------------------------
 각주::=

  1. 문자열을 반복적으로 수정해야 하는 경우-루프 작업과 같은- String개체는 계속되는 새로 만드는 작업으로 인해 오버해드가 클 수 있다. 이를 대처하여 사용할 수 있는 것이 StringBuilder라고 한다. 또한 방향 특성이 다른 참조 타입 형식과는 달리 기본적으로 [in/out] 특성을 갖는다. 자세한 사항은 MSDN참조 [본문으로]
  2. MSDN: 문자열에 대한 기본 마샬링 [본문으로]
 
posted by 방랑군 2012. 1. 21. 22:34

출처 :  http://jafm00n.tistory.com/51

 다음 표에서는 Win32 API(Wtypes.h에 포함) 및 C 스타일 함수에서 사용되는 데이터 형식의 목록을 보여 줍니다. 
  관리되지 않는 대부분의 라이브러리에는 이러한 데이터 형식을 매개 변수를 통해 전달하고 값을 반환하는 함수가 포함되어 있습니다.
  세 번째 열에는 관리 코드에서 사용하는 .NET Framework 기본 제공 값 형식 또는 클래스가 표시되어 있습니다. 
  어떤 형식을 이 표에 나열된 동일한 크기의 다른 형식으로 대체할 수도 있습니다.

 

 Wtypes.h의
 관리되지 않는 형식
 관리되지 않는 
C 언어 형식
 관리되는 클래스 이름   설명 
 HANDLE  void*   System.IntPtr  32비트 Windows 운영 체제의 경우 32비트, 64비트 Windows 운영 체제의 경우 64비트 
 BYTE  unsigned char   System.Byte   8비트
 SHORT  short  System.Int16  16비트
 WORD  unsigned short  System.UInt16   16비트
 INT  int  System.Int32  32비트
 UINT  unsigned int  System.UInt32   32비트 
 LONG  long  System.Int32   32비트 
 BOOL  long  System.Int32   32비트 
 DWORD  unsigned long  System.UInt32   32비트 
 ULONG  unsigned long  System.UInt32    32비트
 CHAR  char  System.Char  ANSI로 데코레이트
 LPSTR  char*  System.String 또는
 System.Text.StringBuilder
 ANSI로 데코레이트
 LPCSTR  Const char*  System.String 또는
 System.Text.StringBuilder
 
 ANSI로 데코레이트
 LPWSTR  wchar_t*  System.String 또는
 System.Text.StringBuilder
 유니코드로 데코레이트
 LPCWSTR  Const wchar_t*  System.String 또는
 System.Text.StringBuilder
 
 유니코드로 데코레이트
 FLOAT  Float  System.Single  32비트
 DOUBLE  Double  System.Double  64비트