возвращение строки c в программу на C # - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть библиотека C ++, в которой есть функция, которая возвращает строку ac, и у меня есть программа на C #, которая вызывает эту функцию и возвращает данные в строку C #.Вот что я имею в виду

__declspec(dllexport) const char* function (const char* str) {
        std::string stdString( str );
        std::cout << stdString.c_str() << std::endl; // this prints fine, no data loss
        return stdString.c_str();
}

А вот код C #

  [DllImport("MyDLL.dll")]
  public static extern string function(string data);

  string blah = function("blah");
  Console.WriteLine(blah); // doesn't print anything... 

Когда я смотрю на местных жителей, он говорит, что переменная "бла" равна "".

Что случилось с данными?

1 Ответ

4 голосов
/ 07 декабря 2011

Ваш код на C ++ не работает.Вы возвращаете указатель на локальную переменную.Он больше не существует после возврата функции.Это имеет тенденцию работать случайно в программе на C ++, но является сильным неопределенным поведением.Это может не сработать в сценарии взаимодействия, использование стека маршалером pinvoke перезапишет строку.

Объявление, которое может работать:

 void function (const char* str, char* output, size_t outputLength)

Использование StringBuilder в [DllImport]объявление для аргумента output и передача инициализированного с достаточной емкостью.

...