【发布时间】:2016-09-23 08:40:41
【问题描述】:
有C++ api:
typedef struct
{
BYTE bCommandCode;
BYTE bParameterCode;
struct
{
DWORD dwSize;
LPBYTE lpbBody;
}
Data;
}
COMMAND;
还有一个功能:
DLL_API DWORD WINAPI ExecuteCommand( LPCSTR, CONST COMMAND, CONST DWORD, LPREPLY);
还有我的 C# 等效代码:
public struct Data
{
public int dwSize;
public byte[] lpbBody;
}
public struct Command
{
public byte bCommandCode;
public byte bParameterCode;
public Data Data;
}
[DllImport(@"api.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int ExecuteCommand(string port, Command command, int timeout, ref Reply reply);
这里不需要回复结构。
我调用 ExecuteCommand:
Command command = new Command();
command.bCommandCode = 0x10;
command.bParameterCode = 0x10;
byte[] bData = { 0xff, 0xff };
command.Data.dwSize = bData.Length;
command.Data.lpbBody = bData;
Reply reply = new Reply();
var result = ExecuteCommand("COM1", command, 5000, ref reply);
当我看到来自 C++ dll 的日志时,我发现 byte[] bData 根本没有被正确识别。我做错了什么?也许这个定义不正确:public byte[] lpbody?如何将结构中的数组作为 LPBYTE 传递给 C++ 方法?
【问题讨论】:
标签: c# c++ pinvoke marshalling