Я бы сделал это так:
Delphi
type
TInfo = array [0..255] of byte;
procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;
C #
[DllImport(@"testlib.dll")]
static extern void GetInfo(int Memadr, int Infolen, byte[] result);
static void Main(string[] args)
{
byte[] result = new byte[256];
GetInfo(0, result.Length, result);
foreach (byte b in result)
Console.WriteLine(b);
}
Вынеобходимо получить соглашения о вызовах для соответствия.Я выбрал stdcall
, который используется по умолчанию для P / invoke (поэтому он не указан в сигнатуре P / invoke).
Я бы не стал возвращать массив как возвращаемое значение функции.Проще всего упорядочить его как параметр.
На самом деле, вообще говоря, если вы хотите избавиться от буферов фиксированного размера, вы можете сделать это следующим образом:
Delphi
procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;
Затем, чтобы заполнить буфер, вам нужно будет использовать некоторую арифметику указателей или что-то эквивалентное.