C# 调用C++ dll传送结构体的问题???急

许_鑫 2013-11-22 11:18:00
我们用C# 调用别人开发的dll,传值的时候出现问题:
C++:
1. 定义的结构体为:
typedef struct
{
char TxBuffer[10];
bool TxFlag;
char DeviceIndex;
char CommandWord;
char Param1;
char Param2;
}Typedef_MLP_Comm, *pTypedef_MLP_Comm;
2. 对外的接口为:
bool __declspec(dllexport) MLP_CommCommand(pTypedef_MLP_Comm pMLP_Comm);//串口指令

C#:
1. 通过C#转换后的结构体:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct Typedef_MLP_Comm
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public byte[] TxBuffer;
public bool TxFlag;
public byte DeviceIndex;
public byte CommandWord;
public byte Param1;
public byte Param2;
}

2. C# 对应的接口方法:
[DllImport(LibraryFile, EntryPoint = "MLP_CommCommand", CallingConvention = CallingConvention.Cdecl)]
public static extern bool MLP_CommCommand(ref Typedef_MLP_Comm pMLP_Comm);//串口指令


问题描述:
我通过C# 来调用dll,具体调用方法如下:
Typedef_MLP_Comm MLP_Comm = new Typedef_MLP_Comm();
MLP_Comm.DeviceIndex = 0x01;
MLP_Comm.CommandWord = 0x51;
bool retValue = MPL_CONNECTION_DLL.MLP_CommCommand(ref MLP_Comm);

请问我在dll的代码中加入AfxMessageBox来调试,在dll总是获取不到MLP_Comm中DeviceIndex和CommandWord的值,但是在 dll中设置MLP_Comm.param的值确可以在C#中获取到?

而且存在很奇怪的问题,我将C#结构体中变量顺序改变,返回的值也会改变???
...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2013-11-22
  • 打赏
  • 举报
回复
可能是数据对齐的问题,你先确认两个结构长度是否一样? C++ int size = sizeof(Typedef_MLP_Comm); C# int size = Marshal.SizeOf(Typedef_MLP_Comm);
bdmh 2013-11-22
  • 打赏
  • 举报
回复
把那几个字段都加上MarshalAs()
Todd_Pointer 2013-11-22
  • 打赏
  • 举报
回复
AfxMessageBox调试? 靠谱吗? 怎么不直接用调试工具调试?
秋的红果实 2013-11-22
  • 打赏
  • 举报
回复
成员数据类型是不是一致,C#里的byte和C++里的char在内部表示方式是否一样,建议换几种类型试一试

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧