将指向 DWORD 的指针从 C# 传递到 C++ DLL
Pass pointer to DWORD from c# to c++ DLL
我正在尝试从 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# 版本时,代码会执行并且 returns 为真,但是设备不会重新启动。我怀疑这是由于我传递 pData
参数的方式所致?
当您调用 SetData(address, 0, cmd, 6)
时,字节数是 24,而不是 6。6 是项目的数量,而不是数组的大小,这是您在 C++ 示例中传递的内容已经给了
我正在尝试从 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# 版本时,代码会执行并且 returns 为真,但是设备不会重新启动。我怀疑这是由于我传递 pData
参数的方式所致?
当您调用 SetData(address, 0, cmd, 6)
时,字节数是 24,而不是 6。6 是项目的数量,而不是数组的大小,这是您在 C++ 示例中传递的内容已经给了