c#调用c++dll时 在结构体上出现问题

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 签名的调用约定和参数与非托管的目标签名是否匹配。

请大侠们务必指教!我好郁闷!

隔江千里
浏览 675回答 3
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 设置 为相同的大小。

HUWWW

你这个是自己写的么,你应该用生成工具生成了再改 PInvoke自己写的话是很容易出错的

慕的地6264312

我用了P/Invoke Interop Assistant - Overview 还是不行,您知道有什么更好的工具吗?谢谢
打开App,查看更多内容
随时随地看视频慕课网APP