如何将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)
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的数组是否合适,或者你是否真的想将第二项设置为非零值.