如何使用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);
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的数组边界溢出,也可能导致各种错误