原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述

依时利读卡器二次开发Demo我要用C#读依时利的读卡器,给的是Delphi的Demo,想把它转成C#的,代码如下:publicstructTERTradeParam{publicstringIndexSectorPwdA;//="A0A1A2A3A4A5";publicstringConsumePwd;//="000000000000";publicstringChargePwd;//="111111111111";publicstringTACPwd;//="0123456789ABCDEF0123456789ABCDEF";publicintAuthType;//=2;publicintAPID;//=3;publicstringEnterpriseID;//="11223344";publicstringProvinceID;//="11223344";publicstringProvinceAID;//="Mifare1App";publicstringGroupAID;//="Mifare2App";publicstringEnterpriseAID;//="Mifare3App";publicintCardFormat;//=0;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]publicstructTER690CardInfo{[MarshalAs(UnmanagedType.I4)]publicintCardNo;//卡号[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicchar[]CardName;//姓名[MarshalAs(UnmanagedType.U4)]publicInt32CardBalance;//卡余额(单位分)[MarshalAs(UnmanagedType.U4)]publicInt32ChargeTimes;//充值次数[MarshalAs(UnmanagedType.U8)]publicInt64OverPwd;//超额密码[MarshalAs(UnmanagedType.U4)]publicInt32DayMoney;//日累计[MarshalAs(UnmanagedType.U2)]publicInt16Period;//消费时段[MarshalAs(UnmanagedType.U2)]publicInt16PeriodCount;//时段次数[MarshalAs(UnmanagedType.U4)]publicInt32MonthDay;//消费月日[MarshalAs(UnmanagedType.U4)]publicInt32OrderGroup;//订餐分组(0-15组)[MarshalAs(UnmanagedType.U2)]publicInt16OrderMonth;//订餐月[MarshalAs(UnmanagedType.U2)]publicInt16OrderDay;//订餐日[MarshalAs(UnmanagedType.U2)]publicInt16OrderListType;//订餐表类型[MarshalAs(UnmanagedType.U2)]publicInt16CycleMealFlag;//重复消费标志[MarshalAs(UnmanagedType.ByValTStr,SizeConst=8)]publicstringOrderList;//订餐表[MarshalAs(UnmanagedType.U2)]publicInt16ReservedFlag;//保留,补贴批次[MarshalAs(UnmanagedType.U2)]publicInt16Privillege;//权限[MarshalAs(UnmanagedType.U8)]publicInt64EnterpriseID;//企业ID,按BCD格式存储}//读写参数[DllImport("ERTrans.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternboolOpenReader(intCommStyle,intClockModel,intComPort,intBaudRate,TERTradeParamaParam);[DllImport("ERTrans.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)][return:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolReadER690Card(intaSectorNo,stringPwdA,TER690CardInfoTER690CardInfo);[DllImport("ERTrans.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternboolWriteER690Card(intaSectorNo,stringPwdA,TER690CardInfoTER690CardInfo);publicclasssttuct{publicstructaParam{publicstringIndexSectorPwdA;//="A0A1A2A3A4A5";publicstringConsumePwd;//="000000000000";publicstringChargePwd;//="111111111111";publicstringTACPwd;//="0123456789ABCDEF0123456789ABCDEF";publicintAuthType;//=2;publicintAPID;//=3;publicstringEnterpriseID;//="11223344";publicstringProvinceID;//="11223344";publicstringProvinceAID;//="Mifare1App";publicstringGroupAID;//="Mifare2App";publicstringEnterpriseAID;//="Mifare3App";publicintCardFormat;//=0;publicaParam(string_IndexSectorPwdA,string_ConsumePwd,string_ChargePwd,string_TACPwd,int_AuthType,int_APID,string_EnterpriseID,string_ProvinceID,string_ProvinceAID,string_GroupAID,string_EnterpriseAID,int_CardFormat){IndexSectorPwdA=_IndexSectorPwdA;ConsumePwd=_ConsumePwd;ChargePwd=_ChargePwd;TACPwd=_TACPwd;AuthType=_AuthType;APID=_APID;EnterpriseID=_EnterpriseID;ProvinceID=_ProvinceID;ProvinceAID=_ProvinceAID;GroupAID=_GroupAID;EnterpriseAID=_EnterpriseAID;CardFormat=_CardFormat;}}[DllImport("ERTrans.dll",CharSet=CharSet.Auto)]publicstaticexternboolOpenReader(intCommStyle,intClockModel,intComPort,intBaudRate);}privatevoid连接_Click(objectsender,EventArgse){TERTradeParamaParam=newTERTradeParam();if(OpenReader(3,906,0,0,aParam)){this.Text="连接成功。";}else{this.Text="连接失败!";}}TER690CardInfoER690CardInfo=newTER690CardInfo();privatevoid读取_Click(objectsender,EventArgse){try{//读取卡数据inti=int.Parse(this.textEdit1.Text.Trim());if(ReadER690Card(i,"FFFFFFFFFFFF",ER690CardInfo)){this.textEdit2.Text=ER690CardInfo.CardNo.ToString();//MessageBox.Show("连接成功!");}else{this.Text="读取失败!";//MessageBox.Show("读取失败!");}}catch(Exception){this.Text="失败";}}问题:红色代码报错请各位大神帮帮忙(分数本想多给,但只剩下这么多了)

解决方案

时间: 2024-08-08 02:26:59

原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配的相关文章

C# 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配

原文:C# 调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配 在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

原文:函数调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配. 在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] 要注意C++与NET中数据类型的对应:   //c++:char * ---- c#:string //传入参数   //c++:char * ---

c++-C# 托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述 C# 托管的 PInvoke 签名与非托管的目标签名不匹配 CLIENT_API BOOL CALL_METHOD CLIENT_SnapPicture(LLONG lLoginID, SNAP_PARAMS par); typedef struct _snap_param { unsigned int Channel; unsigned int Quality; unsigned int ImageSize; unsigned int mode; unsigned int Inter

托管的 PInvoke 签名与非托管的目标签名不匹配

问题描述 C++代码:BOOL__stdcallHik_PlayM4_OpenFile(LONGnPort,LPSTRsFileName);C#:[DllImport("HikPlayM4.dll",CallingConvention=CallingConvention.StdCall)]//publicexternstaticboolHik_PlayM4_OpenFile(longnPort,[MarshalAs(UnmanagedType.LPStr)]stringsFileNam

c#- 托管DLL无法加载非托管Dll,怎么办?

问题描述 托管DLL无法加载非托管Dll,怎么办? 比如报错,"无法加载 DLL"libcurl.dll": 找不到指定的模块" 我已经引用了托管DLL libcurlNET.dll,这个托管DLL需要引用libcurl.dll,两个DLL已经放在了同一个目录下,还是报错,请指点·· 解决方案 C#用不着这个库,你直接用httpwebrequest就可以了. 解决方案二: htttprequest 效率低 解决方案三: 托管调用非托管的DLL编写C++非托管DLL以

如何在ubuntu下编译APK,这个APK的签名为非原生应用的签名?

问题描述 如题,想在ubuntu下编译一个APK,因为这个APK里要用到系统的一些代码,可是我不希望这个APK的签名为系统签名,如何做到?一般情况下编好后都是在out/...system/app下,而且只要你有手机的权限,就可以push apk到手机system/app下.我只是希望能编一个类似第三方的APK,如何做到?求大神解决. 问题补充:MyEyeOfJava 写道 解决方案 做自己的keystore文件,重新对APK进行签名~

c++.net 托管类封装非托管类

C++.net中非托管的代码虽然在托管里面可以直接使用,但是有时候却会被限制.比如当需要用托管里面的 ArrayList 存储一个非托管的对象的时候就需要用一个托管的类把这个非托管的类封装一下,其他的封装的原因我也没想到,刚开始接触c++.net,基本是需要什么学什么,我是这个原因才去封装的.   比如一个非托管的类如下 class serverInfo { public: serverInfo(); ~serverInfo(); string CSTR_DBIPADDRESS; //数据库ip

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

.NET,你忘记了么?(二)——使用using清理非托管资源

我们都知道,垃圾回收可以分为Dispose和Finalize两类,关于这两者的区别已经太多了 ,一个是正常的垃圾回收GC所调用的方法,另外一个是终结器Finalizer,所调用的方法,在 Effective C#一书中,有着明确的建议是说使用IDispose接口来代替Finalize.原因是因为 Finalize终结会增加垃圾回收对象的代数,从而影响垃圾回收. 有了上述的原因,我们现在只来看使用IDispose接口的类. 在.NET中,绝大多数的类都是运行在托管的环境下,所以都由GC来负责回收,