无法在C#数组中返回delphi数组

问题描述 投票:2回答:2

我想在C#中使用delphi数组函数。

我的delphi代码:

TIntegerArray = array of integer;
function Testarray(): TIntegerArray stdcall; export;
 var
   res: TIntegerArray2;
 begin
   SetLength(res, 10);
   res[5] := 55;
   Result := res;
 end;
 exports Testarray;

C#代码:

[DllImport("GitaTele.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int[] Testarray();

显示错误:

无法封送'返回值':无效的托管/非托管类型组合。

c# delphi pinvoke
2个回答
3
投票

Delphi动态数组不是有效的互操作类型。您需要让调用者分配数组,然后让被调用者填充它。

procedure PopulateArray(arr: PInteger; var len: Integer); stdcall;
var
  i: Integer;
  returnArray: TArray<Integer>;
begin
  returnArray := GetArray;
  len := Min(len, Length(returnArray));
  for i := 0 to len - 1 do
  begin
    arr^ := returnArray[i];
    inc(arr);
  end;
end;

请注意,export没有意义,将被忽略,为简单起见应将其删除。

从C#调用代码是:

[DllImport("...", CallingConvention = CallingConvention.StdCall)]
public static extern void PopulateArray(
    [In, Out]
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]
    int[] arr,
    ref int len
);

....

int[] arr = new int[50];
int len = arr.Length;
PopulateArray(arr, ref len);
// len now contains actual length

0
投票

经过测试,此解决方案无效...

© www.soinside.com 2019 - 2024. All rights reserved.