Выделение структуры, содержащей c-строки - PullRequest
3 голосов
/ 01 августа 2009

У меня есть структура C ++

struct UnmanagedStruct
{
   char* s;
};

и структура C #

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
}

библиотека C ++ выставляет

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

И это импортируется как

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

1 Ответ

0 голосов
/ 01 августа 2009

Редактирование и исправление: Для возвращаемых значений вызовов p / invoke «нормальный» метод не работает. Я так привык к нормальному, ref и out поведению, связанному с параметрами метода, что я предполагал, что возвращаемые значения будут работать аналогичным образом. Вот ссылка для решения проблемы возвращаемого значения:
Ошибка PInvoke при сортировке структуры со строкой

Вам нужно использовать StringBuilder, только если вы передаете структуру методу C ++ в качестве параметра byref, а строка является буфером, который метод изменит. Для возвращаемого значения вам просто нужно указать тип строки, который в данном случае:

struct ManagedStruct
{
    [MarshalAs(UnmanagedType.Lpstr)]
    string s;
}

Помните, чтобы добавить свойство для предоставления строки, так как s здесь является приватным (что нормально, поля должны быть приватными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...