본문 바로가기

C#

Marshal.PtrToStructur (Returning pointers from unmanaged to managed code)

728x90

관리되지 않는 메모리 블럭의 데이터를 지정된 형식의 새로 할당된 관리되는 개체로 마샬링한다.

[ComVisibleAttribute(true)]
public static Object PtrToStructure (
    IntPtr ptr,
    Type structureType
)

structureType는 형식이 지정된 클래스나 구조체여야 한다. 즉, 참조 타입, 값 타입 모두 가능하다. 다만 레이아웃이 sequential 또는 Explicit로 설정되어 있어야 한다. 값 형식이 전달될 경우 반환값은 boxing된 인스턴스이다. 리턴값이 object 타입이므로 사용할 때는 사용하려는 타입으로 형변환 하여 사용해야 한다.


[C++]

SomeData* test();

typedef struct _Data Data;  
struct _Data{  
    int a;  
    int b;  
}

[C#]

[StructLayout(LayoutKind.Sequential)]  
public class SomeData  
{  
    public Int32 a;  
    public Int32 b;  
}

[DllImport("DynamicLibrary.dll", CharSet=CharSet.Auto)]
public static extern IntPtr test();

public static SomeData testWrapper() {
  var ptr = test();
  try {
    return (SomeData)Marshal.PtrToStructure(ptr, typeof(SomeData));
  } finally {
    // Free the pointer here if it's allocated memory
  }
}

 

[출처]
https://six605.tistory.com/426
https://stackoverflow.com/questions/2338146/returning-pointers-from-unmanaged-to-managed-code

728x90