导入具有 BYTE* 输出的 DLL 时出现问题

本文关键字:DLL 问题 输出 BYTE 导入 | 更新日期: 2023-09-27 18:37:05

我正在将一个函数从非托管DLL导入到C#中。C++函数签名

如下
int RF_PowerOnEx(int nDev, int nCardType, DWORD* pdwRXSize, BYTE* lpbRXData)

我按如下方式导入它

[DllImport("TP9000.dll")]
public static extern int RF_PowerOnEx(int nDev, int nCardType, out int pdwRXSize, out byte[] lpbRXData);

但是这样做给了我一个System.AccessViolationException。我已经成功导入了除此特定功能之外的其他功能。pdwRXSize 和 lpbRXData 都被视为输出。整数和缓冲区被初始化,然后传递到函数中,然后填充缓冲区。 帮助!!!!我似乎能够将输入参数传递到 DLL 中,但无法获取输出参数。我尝试传递字符串生成器对象无济于事。 有人可以帮助我吗?谢谢!

编辑:错别字

导入具有 BYTE* 输出的 DLL 时出现问题

我建议您像这样声明托管签名

public static extern int RF_PowerOnEx(int nDev, int nCardType, out int pdwRXSize, [out] IntPtr lpbRXData);

然后直接从非托管内存"手动"编组字节数组,使用应在 pdwRXSize 中设置的长度信息。

你真的需要更多地了解函数实现:特别是,调用方是否应该做一些事情来释放包含数据缓冲区的内存?

它不是out byte[],这相当于 BYTE**。 让它只是普通的字节[]。 而 pdwRXSize 是ref,将其设置为数组的大小。 这样称呼它:

byte[] buffer = new byte[666];
int size = buffer.Length;
int retval = RF_PowerOnEx(device, cardtype, ref size, buffer);
if (retval == okay) processData(buffer, size);

您必须对所需的数组大小进行有根据的猜测。

引发EntryPointNotFoundException,因为 .NET 声明的名称与非托管声明不符(因为下划线)。

尝试:

    [DllImport("TP9000.dll", EntryPoint = "RF_PowerOnEx")]
    public static extern int RFPowerOnEx(int nDev, int nCardType, out int pdwRXSize, out byte[] lpbRXData);