Renvoyer un tableau C ++ en C #

Je n’arrive pas à comprendre comment renvoyer un tableau d’une DLL C ++ exscope vers mon programme C #. La seule chose que j’ai trouvée dans Google, c’est d’utiliser Marshal.Copy () pour copier le tableau dans un tampon, mais cela ne me donne pas les valeurs que j’essaie de renvoyer, je ne sais pas ce que cela me donne.

Voici ce que j’ai essayé:

Fonction exscope:

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

Partie C #:

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

Je sais que le type de retour int [] est probablement erroné à cause des différences gérées / non gérées, je ne sais tout simplement pas où aller à partir de maintenant. Je n’arrive pas à trouver de réponse à autre chose que de retourner des tableaux de caractères en chaînes, et non des tableaux d’entiers.

J’ai pensé que la raison pour laquelle les valeurs que j’obtiens avec Marshal.Copy ne sont pas celles que je retourne, c’est parce que le tableau ‘arr’ de la fonction exscope est supprimé, mais je ne suis pas sûr à 100%, si quelqu’un peut effacer cela. ce serait génial.

J’ai mis en œuvre la solution proposée par Sriram. Au cas où quelqu’un le voudrait ici, c’est.

En C ++, vous créez une DLL avec ce 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; } 

La DLL s’appellera InteropTestApp .

Ensuite, vous créez une application console en 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(ssortingng[] 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 contient maintenant les valeurs 1,2,3,4,5 .

J’espère que cela pourra aider.