无法返回C#数组中的delphi数组
我想在C#中使用delphi数组函数 我的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#代码: 向我显示错
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
没有任何作用。@DavidHeffernanMarshalAs(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