问题描述
下面的方法是c++写的DLL封装的方法,我要在c#里面引用然后使用:intSTDCALLSDT_ReadBaseMsg(intiPortID,unsignedchar*pucCHMsg,unsignedint*puiCHMsgLen,unsignedchar*pucPHMsg,unsignedint*puiPHMsgLen,intiIfOpen);
我在c#里面是这样写的:///<summary>///读取卡的信息///</summary>///<paramname="iPortID">端口号</param>///<paramname="pucManaInfo"></param>///<paramname="iIfOpen"></param>///<returns></returns>[DllImport("IdCardDLL/sdtapi.dll")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,refchar[]pucCHMsg,refintpuiCHMsgLen,refchar[]pucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,refchar[]pucCHMsg,refintpuiCHMsgLen,refchar[]pucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,iIfOpen);}
然后Form窗体中这样调用:intpuiCHMsgLen=0;intpuiPHMsgLen=0;char[]pucCHMsg=newchar[1024];char[]pucPHMsg=newchar[1024];inti=ReadBaseMsg(1001,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,1);MessageBox.Show(i.ToString()+""+pucCHMsg.Length);
调用之后发现,pucCHMsg根本获取不到值,请大家帮忙分析下,谢谢!
解决方案
本帖最后由 fendy5201 于 2014-03-01 15:36:12 编辑
解决方案二:
设备均可正常得到端口值,没有其他的异常,DLL的引用路径也是对的。
解决方案三:
privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,...intpuiCHMsgLen=1024;StringBuilderpucCHMsg=newStringBuilder(puiCHMsgLen);inti=ReadBaseMsg(1001,pucCHMsg,refpuiCHMsgLen,...
解决方案四:
引用2楼gomoku的回复:
privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,...intpuiCHMsgLen=1024;StringBuilderpucCHMsg=newStringBuilder(puiCHMsgLen);inti=ReadBaseMsg(1001,pucCHMsg,refpuiCHMsgLen,...
我都换成了StringBuilder,仍然是空的,获取不到值,不过谢谢啦!
解决方案五:
有人帮忙看下么?谢谢了先
解决方案六:
你看下传参的类型对没有
解决方案七:
你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi)]
解决方案八:
引用6楼kkzhangyu的回复:
你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi)]
我已经这么写了,还是没有得到值。[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall,EntryPoint="SDT_ReadBaseMsg")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,refbytepucCHMsg,refintpuiCHMsgLen,refbytepucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,refbytepucCHMsg,refintpuiCHMsgLen,refbytepucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,refpucCHMsg,refpuiCHMsgLen,refpucPHMsg,refpuiPHMsgLen,iIfOpen);}
解决方案九:
debugview慢慢调试看看dll里面能接受到不最好dll返回之前再输出下结果
解决方案十:
二代身份证PC端标准调用接口。
解决方案十一:
[DllImport("IdCardDLL/sdtapi.dll",CharSet=CharSet.Ansi,EntryPoint="SDT_ReadBaseMsg")]privatestaticexternintSDT_ReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,StringBuilderpucPHMsg,refintpuiPHMsgLen,intiIfOpen);publicunsafestaticintReadBaseMsg(intiPortID,StringBuilderpucCHMsg,refintpuiCHMsgLen,StringBuilderpucPHMsg,refintpuiPHMsgLen,intiIfOpen){returnSDT_ReadBaseMsg(iPortID,pucCHMsg,refpuiCHMsgLen,pucPHMsg,refpuiPHMsgLen,iIfOpen);}
解决方案十二:
StringBuilder改成string,反正是参数不对个个的试
解决方案十三:
从C#中传递一个缓冲区到DLL中,用以获取数据时,需要进行托管内存与非托管内存之间的转换。1char*对应到C#为IntPtr2从托管内存到非托管内存的转换为:定义一个byte[]buff,获取IntPtr,GCHandlegc=GCHandle.Alloc(buff,GCHandleType.Pinned);IntPtrp=gc.AddrOfPinnedObject();2从非托管内存到托管内存的转换为:Marshal.Copy(...)系列方法其中一个
解决方案十四:
楼主解决这个问题了吗,我也遇到相似的问题了,我的问题是结构体返回的值不完整,也就是说,这个结构体内,有的变量能够返回值,而有的变量没有返回值。
解决方案十五:
C++和C#参数不匹配。