계속 시도하는데 죽는 현상이 발생해서 삽질을 하고 있었음.
Interop with Native Libraries: http://www.mono-project.com/docs/advanced/pinvoke/
: https://bytes.com/topic/c-sharp/answers/554501-c-c-interop-returning-char
계속 전달되는 char**의 IntPtr에서 char*를 읽기 위해 4bytes씩 읽어오도록 하고 있었는데..
정말 바보 같았다. malloc, memset에서도 sizeof를 그렇게 줄창 쓰면서도
왜!!! 바보같이 4bytes 읽어 왔었는지 급 한심스러워짐..
일단 MS에서도 아래와 같이 가이드를 주고 있음.
하지만 Marshal.SizeOf(typeof(IntPtr)) 보다는
Marshal.SizeOf<IntPtr>()이 warning이 뜨지 않음.
https://msdn.microsoft.com/ko-kr/library/0t7xwf59(v=vs.110).aspx
다음 예제에서는 읽기 / 쓰기를 사용 하 여 관리 되지 않는 배열 하는 방법의 ReadIntPtr 및 WriteIntPtr 메서드.
static void ReadWriteIntPtr() { // Allocate unmanaged memory. int elementSize = Marshal.SizeOf(typeof(IntPtr)); IntPtr unmanagedArray = Marshal.AllocHGlobal(10 * elementSize); // Set the 10 elements of the C-style unmanagedArray for (int i = 0; i < 10; i++) { Marshal.WriteIntPtr(unmanagedArray, i * elementSize, ((IntPtr)(i + 1))); } Console.WriteLine("Unmanaged memory written."); Console.WriteLine("Reading unmanaged memory:"); // Print the 10 elements of the C-style unmanagedArray for (int i = 0; i < 10; i++) { Console.WriteLine(Marshal.ReadIntPtr(unmanagedArray, i * elementSize)); } Marshal.FreeHGlobal(unmanagedArray); Console.WriteLine("Done. Press Enter to continue."); Console.ReadLine(); }
댓글 없음:
댓글 쓰기