将指向DWORD的指针从c#传递给c ++ DLL

时间:2017-05-10 10:05:08

标签: c# c++ extern

我试图从C#控制台应用程序中用C ++编写的DLL调用非托管函数。我已经成功完成了几个简单的方法调用,但是其中一个函数采用了void*的参数,我不确定要通过什么来使它工作。

C ++方法签名

BOOL,   SetData,      (INT iDevice, BYTE iCmd, VOID* pData, DWORD nBytes)

C#方法签名

[DllImport("NvUSB.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static unsafe extern bool SetData(int iDevice, byte iCmd, void* pData, uint nBytes);

使用C ++调用

DWORD pDatatoHi[] = { 'R','E','B','O','O','T' };
SetData(0, 0, pDatatoHi, sizeof(pDatatoHi))

不工作C#

uint* cmd = stackalloc uint[6];

cmd[0] = 'R';
cmd[1] = 'E';
cmd[2] = 'B';
cmd[3] = 'O';
cmd[4] = 'O';
cmd[5] = 'T';

SetData(address, 0, cmd, 6);

我试图从非托管DLL调用的方法应该重启USB设备,当根据设备重新启动时的C ++示例调用该函数时。当我调用C#版本代码执行并返回true时,设备不会重启。我怀疑这是由于我传递pData参数的方式?

1 个答案:

答案 0 :(得分:2)

当您调用SetData(address, 0, cmd, 6)时,字节数为24,而不是6. 6是项目数,而不是数组的大小,这是您在C ++示例中传递的内容#&# 39;已经给出了