Маршал "char *" в C#

учитывая следующую функцию C в DLL:

char * GetDir(char* path );

Как бы вы П/вызвать эту функцию в C# и маршал гольца * правильно. .NET, похоже, знает, как делать LPCTSTR, но когда я не могу понять, какой маршалинг не вызывает NotSupportedException для запуска при вызове этой функции.

2 ответов


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

более надежный способ-ввести возврат GetDir в IntPtr. Тогда вы можете использовать любого Маршала.Функции PtrToStringAnsi для того, чтобы получить строковый тип. Он также дает вам гибкость th освобождать струна по вашему выбору.


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

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


попробовать

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

строка автоматически маршалируется в строку с нулевым завершением, и с помощью свойства CharSet вы сообщаете Маршаллеру, что он должен использовать ANSI, а не Unicode. Примечание: используйте string (или System.String) для const char*, но StringBuilder для char*.

вы также можете попробовать MarshalAs, как в .