Маршал “символ *” в C#

Вы должны добавить wireguard в качестве модуля вне дерева, и вы можете увидеть в этом разделе руководства , как создать соответствующий рецепт.

В слое poky есть несколько примеров, и вы можете найти пример модуля ядра .

20
задан Adam Haile 2 October 2008 в 15:12
поделиться

2 ответа

Ответ OregonGhost только корректен, если символ* возвратился из GetDir, или выделяется в HGlobal или LocalAlloc. Я не могу помнить, какой, но CLR предположит, что любой строковый тип возврата от функции PInvoke был выделен с одной или другим.

А больше устойчивого пути состоит в том, чтобы ввести возврат GetDir, чтобы быть IntPtr. Затем можно использовать любого Маршала. PtrToStringAnsi функционирует для ухода строкового типа. Это также дает Вам th гибкость освобождения строки способом Вашего выбора.


[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);

можно ли дать нам какие-либо другие подсказки относительно поведения GetDir? Это изменяет входную строку? Как значение, которое возвращено выделенное? Если можно обеспечить, что я могу дать намного лучший ответ.

22
ответ дан 30 November 2019 в 00:19
поделиться

Попробуйте

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);

, строка автоматически упорядочивается к завершенной нулем строке, и со свойством CharSet, Вы говорите Marshaller, что это должно использовать ANSI, а не Unicode.Примечание: Используйте строку (или Система. Строка) для символа константы*, но StringBuilder для char*.

можно также попробовать MarshalAs, как в этот пример .

12
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: