Pass byte array from C# to C++
If you want to pass a byte array to native DLL as parameter, you can use the Intptr to do this, please check the demo below.
/C++ API code: TestDLL_API void TestArrayPara(BYTE * pArray, int nSize) { for (int i=0; i<nSize; i++) printf("%d\n", pArray[i]); } //C# code: class TestClass { [DllImport(@"TestDll.dll")] public static extern void TestArrayPara(IntPtr pArray, int nSize); public static void Test() { byte[] array = new byte[16]; for (int i = 0; i < 16; i++) { array[i] = (byte)(i + 97); } int size = Marshal.SizeOf(array[0]) * array.Length; IntPtr pnt = Marshal.AllocHGlobal(size); try { // Copy the array to unmanaged memory. Marshal.Copy(array, 0, pnt, array.Length); } finally { // Free the unmanaged memory. // Marshal.FreeHGlobal(pnt); } TestArrayPara(pnt, array.Length); Marshal.FreeHGlobal(pnt); Console.WriteLine("End of app"); } } Return char array from C++ to c# //C++ code extern "C" __declspec(dllexport) int* test() { int * arr=new int[4]; arr[0]=1; arr[1]=2; arr[2]=3; arr[3]=4; return arr;} extern "C" __declspec(dllexport) int ReleaseMemory(int* pArray){ delete[] pArray; return 0;} //C# code [DllImport("C:\\Devs\\C++\\Projects\\Interop\\InteropTestApp\\Debug\\InteropTestApp.dll")] public static extern IntPtr test(); [DllImport("C:\\Devs\\C++\\Projects\\Interop\\InteropTestApp\\Debug\\InteropTestApp.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int ReleaseMemory(IntPtr ptr); static void Main(string[] args) { IntPtr ptr = test(); int[] result = new int[4]; Marshal.Copy(ptr, result, 0, 4); ReleaseMemory(ptr); Console.ReadKey(); } }
Comments
Post a Comment