Предположим есть С++'овская функция возвращающая std::string. Квест : вызвать эту функцию из С# так чтобы это все работало и не падало. Делать так:
const char* __stdcall функцияОберткаС++( ... )
{
const std::string ret_str = функцияС++API( ... );
char* pszReturn = NULL;
// Это заклинание тут необходимо, обычный С++ new не работает (ошибка)
pszReturn = (char*)::CoTaskMemAlloc( ret_str.length() + 1 );
strcpy(pszReturn, ret_str.c_str());
return pszReturn;
}
В C# делаем описываем интерфейс:
[DllImport("библиотека.dll", CharSet = CharSet.None)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string функцияОберткаС++( ... );
Вот так вроде работает.
const char* __stdcall функцияОберткаС++( ... )
{
const std::string ret_str = функцияС++API( ... );
char* pszReturn = NULL;
// Это заклинание тут необходимо, обычный С++ new не работает (ошибка)
pszReturn = (char*)::CoTaskMemAlloc( ret_str.length() + 1 );
strcpy(pszReturn, ret_str.c_str());
return pszReturn;
}
В C# делаем описываем интерфейс:
[DllImport("библиотека.dll", CharSet = CharSet.None)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string функцияОберткаС++( ... );
Вот так вроде работает.