为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2018-12-06 16:41:16
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 设置

为相同的大小。

查看完整回答
反对 回复 2019-01-21
?
HUWWW

TA贡献1874条经验 获得超12个赞

你这个是自己写的么,你应该用生成工具生成了再改

PInvoke自己写的话是很容易出错的

查看完整回答
反对 回复 2019-01-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我用了P/Invoke Interop Assistant - Overview 还是不行,您知道有什么更好的工具吗?谢谢
查看完整回答
反对 回复 2019-01-21
  • 3 回答
  • 0 关注
  • 674 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信