4

我正在将一个非托管 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,但无法获取输出参数。我试过传递一个 Stringbuilder 对象无济于事。有谁能够帮我?谢谢!

编辑:错字

4

3 回答 3

2

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

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

然后直接从非托管内存中“手动”编组字节数组,使用应该在pdwRXSize.

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

于 2012-06-14T13:07:42.087 回答
1

不是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);

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

于 2012-06-14T13:45:07.217 回答
0

EntryPointNotFoundException被抛出是因为您的 .NET 声明的名称不符合非托管声明(因为有下划线)。

尝试:

    [DllImport("TP9000.dll", EntryPoint = "RF_PowerOnEx")]
    public static extern int RFPowerOnEx(int nDev, int nCardType, out int pdwRXSize, out byte[] lpbRXData);
于 2012-06-14T12:54:53.037 回答