Если вы вернетесь к памяти .net, выделенной вашим собственным malloc, вам также придется экспортировать освобождение. Я не считаю это желательным действием и вместо этого предпочитаю экспортировать текст как BSTR
. Это может быть освобождено средой выполнения C #, поскольку она знает, что BSTR
был выделен распределителем COM. Кодирование на C # становится намного проще.
Единственная проблема заключается в том, что BSTR
использует символы Unicode, а ваш код C ++ использует ANSI. Я бы обойти это так:
C ++
#include <comutil.h>
BSTR ANSItoBSTR(const char* input)
{
BSTR result = NULL;
int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW > 0)
{
result = ::SysAllocStringLen(0, lenW);
::MultiByteToWideChar(CP_ACP, 0, input, lenA, result, lenW);
}
return result;
}
BSTR GetSomeText(char* szInputText)
{
return ANSItoBSTR(szInputText);
}
C #
[DllImport("MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string GetSomeText(string strInput);