c++结构体的声明
typedef struct _PREAMP_STAT{ BYTE Freqency; // BYTE FPGAvsn1; // BYTE FPGAvsn2; // BYTE CPUvsn1; // BYTE CPUvsn2; // BYTE Hardwarevsn1; // BYTE Hardwarevsn2; // BYTE SerialNum[6]; / BYTE CellVotage[2]; // BYTE CellState; // BYTE MaxConfig; // BYTE ChoiceState[9];// BYTE Reserves[38]; //} PREAMP_STAT,*PPREAMP_STAT;//sizeof(PREAMP_STAT) = 64
c++中的引用:
ReadAmpInfo(PPREAMP_STAT pPreAMPStat);
我在c#中定义的结构:
[StructLayout(LayoutKind.Sequential)] public struct PPREAMP_STAT { [MarshalAs(UnmanagedType.U1)] public Byte Freqency; // [MarshalAs(UnmanagedType.U1)] public Byte FPGAvsn1; // [MarshalAs(UnmanagedType.U1)] public Byte FPGAvsn2; // [MarshalAs(UnmanagedType.U1)] public Byte CPUvsn1; // [MarshalAs(UnmanagedType.U1)] public Byte CPUvsn2; // [MarshalAs(UnmanagedType.U1)] public Byte Hardwarevsn1; // [MarshalAs(UnmanagedType.U1)] public Byte Hardwarevsn2; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public Byte[] SerialNum; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public Byte[] CellVotage; // [MarshalAs(UnmanagedType.U1)] public Byte CellState; // [MarshalAs(UnmanagedType.U1)] public Byte MaxConfig; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)] public Byte[] ChoiceState;// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 38)] public Byte[] Reserves; // } //sizeof(PREAMP_STAT) = 64
导入dll的语句:
[DllImport(@"lib\HardUsb.dll")] public static extern bool ReadAmpInfo( PPREAMP_STAT pPreAMPStat);//
在c#中的引用:
PPREAMP_STAT myPPREAMP_STAT = new PPREAMP_STAT();bool aa= ReadAmpInfo(myPPREAMP_STAT);//就是这句错误
出现的错误是:对 PInvoke 函数“xxxx!xxxxx.mainform::ReadAmpInfo”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
请大侠们务必指教!我好郁闷!
3 回答
智慧大石
TA贡献1946条经验 获得超3个赞
结构体不能这么传,你只能传指针:
如下:
PPREAMP_STAT myPPREAMP_STAT = new PPREAMP_STAT();
byte[] buf = new byte[Marshal.Sizeof(myPPREAMP_STAT)];
IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(buf,0);
MarShal.StructureToPtr(myPPREAMP_STAT,ptr,true);
bool aa=ReadAmpInfo(ptr);//
另外StructLayout 有个 Pack 属性,是设置字节对齐,你问下你用那个dll的字节对齐方式,然后把 Pack 设置
为相同的大小。
- 3 回答
- 0 关注
- 674 浏览
添加回答
举报
0/150
提交
取消