Вам нужно знать, что вы выделяете неуправляемый блок памяти в вашей функции c ++, поэтому невозможно будет передать управляемый объект String или Array из кода C # для «удержания» массива char.
Один из подходов состоит в том, чтобы определить функцию «Delete» в вашей родной dll и вызвать ее для освобождения памяти. На управляемой стороне вы можете использовать структуру IntPtr для временного хранения указателя на массив символов c ++.
// c++ function (modified)
void __cdecl FillAndReturnString(char ** someString)
{
*someString = new char[5];
strcpy_s(*someString, "test", 5); // use safe strcpy
}
void __cdecl DeleteString(char* someString)
{
delete[] someString
}
// c# class
using System;
using System.Runtime.InteropServices;
namespace Example
{
public static class PInvoke
{
[DllImport("YourDllName.dll")]
static extern public void FillAndReturnString(ref IntPtr ptr);
[DllImport("YourDllName.dll")]
static extern public void DeleteString(IntPtr ptr);
}
class Program
{
static void Main(string[] args)
{
IntPtr ptr = IntPtr.Zero;
PInvoke.FillAndReturnString(ref ptr);
String s = Marshal.PtrToStringAnsi(ptr);
Console.WriteLine(s);
PInvoke.Delete(ptr);
}
}
}