如何将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[]匹配。在理想情况下, native DLL将公开一个不同的接口(interface),但是正如您在注释中所述,您无法控制该接口(interface)。

但是,您可以欺骗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的数组是否合适,或者您是否真的打算仅将第二项设置为非零值。

关于c# - 如何使用C#调用接收Delphi开放数组参数的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7944447/

10-08 22:43
查看更多