드디어 PInvoke의 종착지 까지 오고야 말았다.

처음 C#을 배울 때 느꼈던 갈증은 C/C++을 배우면서 해소되는 느낌이다.
IntPtr이 이런것이었다니.
역시 기초가 중요한 것이다.


이렇게 DLL 만들고

1
2
3
4
5
6
7
8
9
unsigned char myByteArray[3];
extern "C" __declspec(dllexport) void getBuf(unsigned char **byteArray, int &size)
{
	myByteArray[0] = 0;
	myByteArray[1] = 1;
	myByteArray[2] = 2;
	size = 3;
	*byteArray = &myByteArray[0];
}


이렇게 쓴다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


class DllWrapper
{
    [DllImport("test_c_dll.dll")]
    public static extern void getBuf(ref IntPtr byteArrayPtr, ref int size);
}

class Program
{
    static void Main(string[] args)
    {
        
        int size = 0;
        IntPtr byteArrayPtr = IntPtr.Zero;
        DllWrapper.getBuf(ref byteArrayPtr, ref size);
        
        byte[] byteArray = new byte[size];

        Marshal.Copy(byteArrayPtr, byteArray, 0, size);

        foreach(byte val in byteArray)
        {
            Console.WriteLine(val.ToString());
        }
    }
}




2011/11/04 - [C# .NET] - [C#] PInvoke 1탄. 데이터 타입 변환표
2011/11/04 - [C# .NET] - [C#] PInvoke 2탄. Normal Data Type
2011/11/04 - [C# .NET] - [C#] PInvoke 3탄. String 타입
2011/11/04 - [C# .NET] - [C#] PInvoke 4탄. ByteArray
2011/11/04 - [C# .NET] - [C#] PInvoke 5탄. Callback Function

+ Recent posts