Return C++ array to C#
I have implemented the solution Sriram has proposed. In case someone wants it here it is.
In C++ you create a DLL with this code:
extern "C" __declspec(dllexport) int* test() { int len = 5; int * arr=new int[len+1]; arr[0]=len; arr[1]=1; arr[2]=2; arr[3]=3; arr[4]=4; arr[5]=5; return arr;}extern "C" __declspec(dllexport) int ReleaseMemory(int* pArray){ delete[] pArray; return 0;}
The DLL will be called InteropTestApp
.
Then you create a console application in C#.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Runtime.InteropServices;namespace DLLCall{ class Program { [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 arrayLength = Marshal.ReadInt32(ptr); // points to arr[1], which is first value IntPtr start = IntPtr.Add(ptr, 4); int[] result = new int[arrayLength]; Marshal.Copy(start, result, 0, arrayLength); ReleaseMemory(ptr); Console.ReadKey(); } }}
result
now contains the values 1,2,3,4,5
.
Hope that helps.