Подтвердить что ты не робот

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

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

char * GetDir(char* path );

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

4b9b3361

Ответ 1

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

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


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

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

Ответ 2

Try

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);
Строка

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

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