Маршал "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, как в .