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
'C#' 카테고리의 다른 글
async 메서드의 void 반환 타입 사용에 대하여 & 가이드라인 (0) | 2023.01.17 |
---|---|
어셈블리 정보를 이용한 버전 관리, 자동 증가 (0) | 2023.01.17 |
관리되는 코드, 관리되지 않는 코드 (0) | 2023.01.17 |
Closure, SOH(Small Object Heap), LOH(Large Object Heap) 오류 발생 원인과 해결방안 (0) | 2023.01.12 |
Find vs FirstOrDefault vs Where + FirstOrDefault vs for loop 속도 비교 (0) | 2023.01.12 |