Полагаю, проблема в том, что вы выделяете память с помощью распределителя среды выполнения C ++, но маршаллер C # пытается освободить ее. Это не может работать. Вам нужно выделить и освободить с тем же распределителем.
Лучший способ, который я знаю, чтобы решить вашу проблему - это набрать BSTR
. При этом используется COM-распределитель, который рад разделиться между собственным и управляемым модулями.
#include <comutil.h>
BSTR cppReturnSomeText()
{
UnicodeString usText("Some Text Here");
std::wstring result = ECUtilsICU::UniCodeStringToWString(usText);
return ::SysAllocString(result.c_str());
}
На стороне C # вы делаете это:
[DllImport(MY_DLL_NAME, CallingConvention=CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string cppReturnSomeText();
Еще одним преимуществом этого является то, что ваш код теперь потокобезопасен, потому что вам больше не нужна глобальная переменная.