Есть дллка на C++. в C# вызывается функция из этой dll — ReturnString().
Функция должна вернуть строку.
Люди советуют — выделить память в C# под строку и передать указатель в ReturnString. Там заполнить буффер. Но тут придется делать два вызова, потому что размер строки неизвестен...
еще вариант:
Выделение и удаление в C++. То есть после вызова функции ReturnString, обработать строку, а затем вызвать другую функцию, скажем, ClearStr из длл, которая освободит память.
или, как сделано сейчас:
в С++ заведена глобальная Std::string. В которую записывается строка, а в C# возвращается string.c_str(). Перед каждым вызовом ReturnString делать string.clear() и писать в переменную заново...
Все ли варианты валидны?
Можно возваращать BSTR* а в C# пометить параметр как out и UnmanagedType.BStr. Думаю, в этом случае не потребуется освобождать что-либо руками, runtime всё сделает за вас. C++ dll-ке придётся выделять строку соотвестещей функцией (SysAllocString).