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

无法返回C#数组中的delphi数组,c#,delphi,pinvoke,C#,Delphi,Pinvoke,我想在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#代码: 向我显示错

我想在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#代码:

向我显示错误:

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


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;

在Delphi中,您返回一个特定类型
tintegeraray2
,而在C中,您尝试将其映射到
int[]
。这应该如何工作?不能直接将数组封送为retun值。即使可以,谁会释放Delphy为该阵列分配的内存?谢谢。edited.my代码大于:TIntegerArray=整数数组;TinteGrarray2=整数数组;不能将数组用作跨DLL边界的函数结果。就这么简单。这也是为什么不能将字符串作为函数结果返回的原因。请改为将其作为var参数传递。但事情并没有那么简单。您还必须决定哪一方负责内存分配/释放。答案会根据具体情况而有所不同。为什么它需要整个
MarshalAs
?他不能直接将数组封送到
PInteger
,即
int*
?您可以不使用
marshallas
,但它允许封送器优化封送。另一方面,由于此示例是可空袭的,因此封送拆收器将只固定数组。因此,从这个意义上说,
MarshalAs
没有任何作用。@DavidHeffernan
MarshalAs(MarshalAs(
您将代码中的
MarshalAs
翻了一倍。@xanatos皮带和支架;-)
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;
[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