问题描述
C++C++调用我是这样写的,然后总是报错参数不正确。C#请各位大神相助!!
解决方案
解决方案二:
报什么错??
解决方案三:
引用1楼yuankaiwsl的回复:
报什么错??
调用导致堆栈不对称。原因可能是托管的PInvoke签名与非托管的目标签名不匹配。请检查PInvoke签名的调用约定和参数与非托管的目标签名是否匹配。
解决方案四:
用char[],然后编译平台选x86
解决方案五:
ref或out
解决方案六:
引用3楼johnliuyuan的回复:
用char[],然后编译平台选x86
我那个引用写的有没有问题大神给看看。
解决方案七:
Cdecl改成StdCall
解决方案八:
如果还不行,就把项目改成X86
解决方案九:
C++HT706_READER_APIREADER_ERREXTERNTagInventoryLoopAndSelect(inthReader,intantennaNum,char*antennaID,unsignedcharcodeSel,unsignedchartRext,unsignedcharBLF,unsignedcharFHSS,unsignedchartc,unsignedcharloopNotChangeNum,unsignedchareveryLoopIsdifferentNum,unsignedshortinventoryTime,char*EpcSet,int*tagcnt,int*loops)
我写的是这样的:C#[DllImport("ModuleAPI.dll",EntryPoint="TagInventoryLoopAndSelect",CharSet=CharSet.Auto,SetLastError=true,CallingConvention=CallingConvention.Cdecl)]publicstaticexternintReadTags(Int16hReader,Int16antennaNum,stringantennaID,bytecodeSel,bytetRext,byteBLF,byteFHSS,bytetc,byteloopNotChangeNum,byteeveryLoopIsdifferentNum,ushortinventoryTime,[Out]StringBuilderEpcSet,refinttagcnt,refintloops);
这个几对应的参数类型对不对呀?
解决方案十:
能把int转成Int16,你也是个人才
解决方案十一:
refstring,网上有很多两种语言的类型对应的文章,楼主可以看一下。
解决方案十二:
C#里面也有char
解决方案十三:
引用8楼ido0926的回复:
C++HT706_READER_APIREADER_ERREXTERNTagInventoryLoopAndSelect(inthReader,intantennaNum,char*antennaID,unsignedcharcodeSel,unsignedchartRext,unsignedcharBLF,unsignedcharFHSS,unsignedchartc,unsignedcharloopNotChangeNum,unsignedchareveryLoopIsdifferentNum,unsignedshortinventoryTime,char*EpcSet,int*tagcnt,int*loops)我写的是这样的:C#[DllImport("ModuleAPI.dll",EntryPoint="TagInventoryLoopAndSelect",CharSet=CharSet.Auto,SetLastError=true,CallingConvention=CallingConvention.Cdecl)]publicstaticexternintReadTags(Int16hReader,Int16antennaNum,stringantennaID,bytecodeSel,bytetRext,byteBLF,byteFHSS,bytetc,byteloopNotChangeNum,byteeveryLoopIsdifferentNum,ushortinventoryTime,[Out]StringBuilderEpcSet,refinttagcnt,refintloops);
这个几对应的参数类型对不对呀?
如果是传入参数,使用string就可以,如果要返回,使用stringbuilder,stringbuilder记得要初始化CallingConvention使用Cdecl还是Stdcall,取决于HT706_READER_API的定义
解决方案十四:
Char*就用string就可以了
解决方案十五:
举例C里面,方法:intmyMethod(char*c);//c可能是char指针变量;或者是char数组的首地址调用:charc="a";char*Point=&c;intI=myMethod(Point);或者,参数按数组传递charc[]=newchar[1];c[0]="a";intmyMethod(c);C#里面,[DllImport(……)]publicstaticexternintmyMethod(StringBuildersb);调用:StringBuildermySB=newStringBuilder();mySB.Append("a");intI=myMethod(mySB);以上是例子,你的问题,根据例子自己构建