gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:54:09 24 4
gpt4 key购买 nike

如何将 Delphi 代码转换为 C#?它需要一个字节数组,但我不确定 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/invoke 轻松地将其与 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com