将C ++数组返回给C#

我似乎无法弄清楚如何将数组从导出的C ++ DLL返回到我的C#程序。 我从google搜索中发现的唯一一件事就是使用Marshal.Copy()将数组复制到缓冲区中,但这并没有给我我想要返回的值,我不知道它给了我什么。

这是我一直在尝试的:

导出function:

extern "C" __declspec(dllexport) int* Test() { int arr[] = {1,2,3,4,5}; return arr; } 

C#部分:

  [DllImport("Dump.dll")] public extern static int[] test(); static void Main(string[] args) { Console.WriteLine(test()[0]); Console.ReadKey(); } 

我知道返回类型int []可能是错误的,因为托管/非托管差异,我只是不知道从哪里开始。 除了将字符数组返回到字符串而不是整数数组之外,我似乎无法找到答案。

我想到我使用Marshal.Copy获得的值不是我返回的值的原因是因为导出函数中的’arr’数组被删除但是我不是100%肯定,如果有人能清除它的话那太好了。

我已经实施了Sriram提出的解决方案。 如果有人想要它在这里。

在C ++中,您使用以下代码创建DLL:

 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; } 

该DLL将被称为InteropTestApp

然后在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); ptr = IntPtr.Add(ptr, 4); int[] result = new int[arrayLength]; Marshal.Copy(ptr, result, 0, arrayLength); ReleaseMemory(ptr); Console.ReadKey(); } } } 

result现在包含值1,2,3,4,5

希望有所帮助。