Marquage du caractère non géré ** dans la chaîne gérée

J’ai une fonction C ++ dans un fichier DLL (elle est compilée avec l’option Jeu de caractères multi-octets):

_declspec(dllexport) void TestArray(char** OutBuff,int Count,int MaxLength) { for(int i=0;i<Count;i++) { char buff[25]; _itoa(i,buff,10); strncpy(OutBuff[i],buff,MaxLength); } } 

Je suppose que le prototype C # doit être le suivant:

  [DllImport("SsortingngsScetch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] private static extern void TestArray([MarshalAs(UnmanagedType.LPArray)] IntPtr[] OutBuff, int Count, int MaxLength); 

Mais dois-je préparer les objects IntPtr pour recevoir des chaînes de code non géré?

Donc, OutBuff est essentiellement un tableau de pointeurs – vous devez donc créer un tableau IntPtr dont les éléments sont des pointeurs valides – c’est-à-dire des valeurs IntPtr qui pointent vers une mémoire valide. Comme ci-dessous:

 int count = 10; int maxLen = 25; IntPtr[] buffer = new IntPtr[count]; for (int i = 0; i < count; i++) buffer[i] = Marshal.AllocHGlobal(maxLen); TestArray(buffer, count, maxLen); string[] output = new string[count]; for (int i = 0; i < count; i++) { output[i] = Marshal.PtrToStringAnsi(buffer[i]); Marshal.FreeHGlobal(buffer[i]); }