Обратите внимание, что строковыми данными C # является Unicode, поэтому, если вы продолжите работу с этим кодом Delphi с использованием PChar, в вызове PInvoke будет выполнено скрытое преобразование из PChar в PWideChar.(Преобразование означает выделение другого буфера памяти и копирование всех данных в новый буфер). Если вы намереваетесь использовать этот код Delphi с C # и заботитесь о производительности, вам следует изменить код Delphi для работы с данными PWideChar.
Есть и другая причина использовать PWideChar вместо PChar: Delphi выделяет тип OleString с помощью распределителя Win32 SysAllocString в соответствии с требованиями COM.Это означает, что получатель строки может освободить ее с помощью Win32 API.
Если вы на самом деле не обрабатываете текст в своей функции, а используете PChar в качестве суррогата для массива произвольных значений байтов, выможет сойти с рук на неуправляемой стороне вызова, но не на управляемой стороне.Если это байтовые данные, их следует объявлять как массив байтов, чтобы избежать преобразований charset или size char.
На стороне C # дома вам понадобится PInvoke для вызова неуправляемой функции DLL Delphi.См. pinvoke.net для получения подробной информации о том, как аннотировать вызов в C #, чтобы PInvoke автоматически позаботился о выделении буфера.Найдите функцию Win32 API, которая передает параметры PChar (или PWideChar), аналогичные вашей функции, а затем найдите в PInvoke.net объявление PInvoke для использования в управляемом коде.