Лично я думаю, что это проще всего сделать с помощью BSTR
и, таким образом, избежать необходимости экспортировать деллокатор.
C ++
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 __stdcall getString()
{
return ANSItoBSTR("Hello world");
}
КонечноЕсли вы работаете со строками Юникода, это еще проще.
BSTR __stdcall getString()
{
return ::SysAllocString(L"Hello world");
}
C #
[DllImport(@"test.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string getString();
И на стороне C # это все.Вы просто звоните getString()
, и он возвращает .net string
, и вам не нужно ничего маршалировать или вызывать коллокатор.