Как мне маршалировать wchar_t * из C ++ в C # как выходной параметр или возвращаемое значение? - PullRequest
7 голосов
/ 22 мая 2011

Я пытался сделать это разными способами, но ни один не работает. У кого-нибудь есть правильный пример для этого? Я просто хочу переместить значение wchar_t* из функции на уровень C #.

1 Ответ

7 голосов
/ 22 мая 2011

Это не так сложно, как вы думаете ... Что такое wchar_t*? Какое значение обычно представляет этот тип? Строка. Это эквивалент типа LPWSTR, определенного в windows.h.

Итак, вы маршалируете как string тип. Однако, поскольку это параметр out (или возвращаемое значение), вам нужно будет использовать StringBuilder class на стороне C #, а не тип string.

Синтаксис P / Invoke будет выглядеть примерно так:

[DllImport("MyLib.dll")]
public static extern void MyFunction(StringBuilder str);

И чтобы использовать его, вы сначала объявляете экземпляр класса StringBuiler с соответствующей емкостью, а затем вызываете функцию:

StringBuilder myString = new StringBuilder(255);
MyFunction(myString);

Помните, что неуправляемый код C ++ должен освобождать строку, чтобы предотвратить утечку памяти. Это единственный доступ к области неуправляемой памяти, где была выделена строка.

...