You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi调用C# DLL时数组长度参数始终固定为31的问题

问题分析与解决方案

问题根源

Delphi的Array of Double属于开放数组类型,在stdcall调用约定下,编译器会自动向参数栈中插入隐藏的数组上下界参数,这直接打乱了C#端预期的参数顺序。你看到的固定值31,实际上是Delphi传递的隐藏数组边界值,而非你传入的arraySize参数——真正的长度值被挤到了栈的未被读取位置,导致C#端始终读取错误的数值。

修复方案

1. 修改Delphi函数类型声明

将开放数组替换为指针类型,匹配C#端LPArray期望的非托管指针格式:

TGetFraData = function(
  dbHash         : Integer;
  pointid        : UInt32;
  unmanagedArray : PDouble;  // 替换为PDouble指针
  arraySize      : Integer
): Bool; stdcall;

2. 调整调用代码

调用时传递数组的首地址,同时增加数组长度校验避免越界:

function TIviumSQLAccess.IviFraData(const PointId : UInt32;
                     const FraData : Array of Double;
                     const arraySize : Integer): Boolean;
begin
  // 校验数组实际长度不小于传入的要求长度
  if (Length(FraData) < arraySize) then
  begin
    Result := False;
    Exit;
  end;
  // 传递数组首地址给DLL
  Result := GetFraData(dbHash, PointId, @FraData[0], arraySize);
end;

额外验证点

  • C#端的SizeParamIndex = 3设置正确:FraData是第3个参数(索引从0开始),length是第4个参数(索引3),与C#的Marshal配置匹配,无需修改C#代码。
  • 确保类型匹配:Delphi的UInt32对应C#的uint,Integer对应C#的int(XE2中Integer为32位,与C#一致)。
  • 调用约定一致性:两端均为stdcall,无需调整。

内容的提问来源于stack exchange,提问作者SpectralShark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:50:28