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

Pas*_*yer 5 c# delphi pinvoke

如何将Delphi代码转换为C#?它需要一个array of Byte,但我不确定C#的等价物是什么.我的尝试不起作用并抛出像AccessViolationException之类的异常.

德尔福:

function SetLevel(a: array of byte): boolean; stdcall; external 'DMX510.dll';
Run Code Online (Sandbox Code Playgroud)

C#:

[DllImport("DMX510.DLL")]
public static extern Boolean SetLevel(Byte[] bytearray);

Byte[] byteArray = new Byte[5];
byteArray[1] = 75;
SetLevel(byteArray);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 8

Delphi开放数组不是有效的互操作类型.你不能通过byte[]P/invoke 轻松地将它与C#相匹配.在理想的世界中,本机DLL会暴露不同的接口,但正如您在注释中所述,您无法控制该接口.

但是,您可以欺骗C#代码传递Delphi DLL正确解释的内容,但它有点脏.关键是这样声明的Delphi open数组有一个额外的隐式参数,包含数组中最后一个元素的索引.

[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);
Run Code Online (Sandbox Code Playgroud)

要清楚,尽管参数列表看起来如此不同,上面的C#代码将成功调用声明的Delphi DLL函数:

function SetLevel(a: array of byte): boolean; stdcall;
Run Code Online (Sandbox Code Playgroud)

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