Так я реализовал успешную отправку массивов из и в Delphi & C #.
C #:
[DllImport("Vendors/DelphiCommunication.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void LoadFromFileCHR(
string sFileName,
ref int iSize,
ref double AreaCoef,
ref double FWaveLength,
ref bool FHasWaveLength,
double[] ChromX,
double[] ChromY
);
Обратите внимание, что отдельные типы имеют REF и массивы НЕ ИМЕЮТ REF , но массивы все равно будут работать как REF в любом случае
Delphi:
Type
ArrayDouble100k = array [0..99999] of Double;
procedure LoadFromFileCHR(
FileName : String;
var Size : Integer;
var AreaCoef : Double;
var FWaveLength: Double;
var FHasWaveLength : Boolean;
var ChromX : ArrayDouble100k;
var ChromY : ArrayDouble100k); StdCall;
begin
//...
end;
exports LoadFromFileCHR;
Обратите внимание, что VAR являетсятакже с параметрами Array (аналог Delphi REF).
У меня были всевозможные ошибки, потому что я имел ref с массивами в коде C #
Еще одна проблема, которая вызвала у меня повреждение памятибыло то, что я не заметил, что эти коды не совпадают в Delphi и C #:
Delphi:
for i := 0 to Length(fileCHR.ChromX) do //This is wrong
C #
for(int i = 0; i < fileCHR.ChromX.Length; i++)
То же самое в Delphi будетbe
for i := 0 to Length(fileCHR.ChromX) - 1 do //This is right
Если вы переполните границы массивов, переданных в delphi, это также может вызвать всевозможные ошибки