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 签名的调用约定和参数与非托管的目标签名是否匹配。
请大侠们务必指教!我好郁闷!
结构体不能这么传,你只能传指针:
如下:
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 设置
为相同的大小。
你这个是自己写的么,你应该用生成工具生成了再改
PInvoke自己写的话是很容易出错的