如何使用c#调用接收Delphi开放数组参数的函数

本文关键字:数组 参数 函数 Delphi 何使用 调用 | 更新日期: 2023-09-27 18:13:00

如何将Delphi代码转换为c# ?它需要一个array of Byte,但我不确定c#的等效是什么。我的尝试不工作,抛出异常,如AccessViolationException。

德尔福

:

function SetLevel(a: array of byte): boolean; stdcall; external 'DMX510.dll';
c#:

[DllImport("DMX510.DLL")]
public static extern Boolean SetLevel(Byte[] bytearray);
Byte[] byteArray = new Byte[5];
byteArray[1] = 75;
SetLevel(byteArray);

如何使用c#调用接收Delphi开放数组参数的函数

Delphi开放数组不是有效的互操作类型。您不能通过P/调用轻松地将其与c# byte[]匹配。在理想情况下,本机DLL会公开不同的接口,但正如您在注释中所述,您无法控制该接口。

然而,你可以欺骗c#代码来传递一些Delphi DLL可以正确解释的东西,但这有点脏。关键是,像这样声明的Delphi开放数组有一个额外的隐式形参,包含数组中最后一个元素的索引。

[DllImport(@"DMX510.DLL")]
public static extern bool SetLevel(byte[] byteArray, int high);
byte[] byteArray = new byte[] { 0, 75, 0, 0, 0};
SetLevel(byteArray, byteArray.Length-1);
要明确的是,尽管参数列表看起来如此不同,上面的c#代码将成功调用Delphi DLL函数声明如下:
function SetLevel(a: array of byte): boolean; stdcall;

我不知道传递长度为5的数组是否合适,或者您是否真的想将第二项设置为非零值。

这就是我如何成功地从Delphi发送数组和向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一样工作 德尔福

:

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)。

我有各种各样的错误,因为我在c#代码中有ref与数组

另一个导致内存损坏的问题是,我没有注意到这些代码在Delphi和c#中是不一样的:

德尔福

:

for i := 0 to Length(fileCHR.ChromX) do //This is wrong
c#

for(int i = 0; i < fileCHR.ChromX.Length; i++)

在delphi中相同的是

for i := 0 to Length(fileCHR.ChromX) - 1 do //This is right

如果传递给delphi的数组边界溢出,也可能导致各种错误