Лучшее, что я нашел, - это быть более ясным о том, что здесь происходит. Наличие строки в качестве возвращаемого типа, вероятно, не рекомендуется в этой ситуации.
Распространенным подходом является передача стороне C ++ буфера и размера буфера. Если он недостаточно велик для того, что GetString должен поместить в него, переменная bufferSize модифицируется, чтобы указать, какой будет подходящий размер. Вызывающая программа (C #) будет тогда увеличивать размер буфера до соответствующего размера.
Если это ваша экспортированная функция dll (C ++):
extern "C" __declspec void GetString( char* buffer, int* bufferSize );
Соответствие C # будет следующим:
void GetString( StringBuilder buffer, ref int bufferSize );
Таким образом, чтобы использовать это в C #, вы должны сделать что-то вроде следующего:
int bufferSize = 512;
StringBuilder buffer = new StringBuilder( bufferSize );
GetString( buffer, ref bufferSize );