不能在 C# 数组中 return delphi 数组
cannot return delphi array in C# array
我想在 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();
显示错误:
Cannot marshal 'return value': Invalid managed/unmanaged type
combination.
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
我想在 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();
显示错误:
Cannot marshal 'return value': Invalid managed/unmanaged type combination.
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