问题描述
C++代码如下:#defineDLLPROC__declspec(dllimport)DLLPROClong__stdcallRdMultiBit(intnSerialNo,intnStationNo,constchar*ucStartAddr,intnNum,unsignedcharucRefValue[]);C#中:[DllImport("ModbusLib.dll",EntryPoint="RdMultiWord",CharSet=CharSet.Auto)]publicstaticexternlongRdMultiWord(intnSerialNo,intnStationNo,char*ucStartAddr,intnNum,short[]sRefValue);中的char*有问题,请问在C#中应该怎么写了?
解决方案
解决方案二:
constchar*改为stringCharSet.Auto改为CharSet.Ansi
解决方案三:
引用1楼akirya的回复:
constchar*改为stringCharSet.Auto改为CharSet.Ansi
short[]sRefValue改为StringBuilder
解决方案四:
路过接分!
解决方案五:
C#中:staticvoidMain(string[]args){intserialNum=1,stationNum=1,registersNum=2;stringstartAdr="0X0000";StringBuilderpsValue=newStringBuilder[]{11,22};Console.WriteLine("ReadyforReadMultiRegisters~!");RdMultiWord(serialNum,stationNum,startAdr,registersNum,psValue);Console.WriteLine("AllReadSuccess~!");}psValue该怎么初始化呢?
解决方案六:
楼主写的C++代码声明的函数不是太好,最好不要用数组作形数,而是用一个指针参数加一个数组长度参数[DllImport("ModbusLib.dll",EntryPoint="RdMultiWord",CharSet=CharSet.Auto)]publicstaticexternintRdMultiWord(intnSerialNo,intnStationNo,[MarshalAs(UnmanagedType.LPStr)]stringucStartAddr,intnNum,[UnmanagedType.ByValArray,SizeConst=xxx]sbyte[]sRefValue);最后这个SizeCount=xxx是传入数组的长度
解决方案七:
另外,楼主的unsignedcharucRefValue[]这个参数传入的是个数组呢还是字符串,如果是字符串的话,最好是改为char*c++的long是32位的,C#的long是64位的C++的char是8位,C#的char/short是16位的
解决方案八:
ifastringisreturned,then:StringBuilderpsValue=newStringBuilder(256);ifanarrayofcharsreturned,then(C++char=C#byte):short[]sRefValue改为byte[]sRefValuechar[]psValue=newchar[2]{11,22};
解决方案九:
该回复于2008-07-31 09:14:23被版主删除
解决方案十:
我的字符数组里要装的就是寄存器里边的东西(即sRefValue这个数组里),我现在只是模拟一下。我所有调用的动态库(c++)写的DLL,里边有个函数是:DLLPROClong__stdcallRdMultiWord(intnSerialNo,intnStationNo,constchar*ucStartAddr,intnNum,shortsRefValue[]);而我想在C#中来用这个函数,那你们说准确的来说该怎么写?
解决方案十一:
发表于:2008-07-1412:47:277楼得分:0ifastringisreturned,then:StringBuilderpsValue=newStringBuilder(256);ifanarrayofcharsreturned,then(C++char=C#byte):short[]sRefValue改为byte[]sRefValuechar[]psValue=newchar[2]{11,22};INT型是不能转换为CHAR型的。。。