问题描述
我在使用GZipStream类进行压缩后使用socket传输,再客户端收到后,再使用GZipStream解压,然后奇怪的问题出现了,在我自己写的客户端解压都没问题,当其他人写的一个Unity的程序调用的时候就报错了,错误如下,好郁闷啊,整个方法我都封装了CreateZStream----System.EntryPointNotFoundException:CreateZStreamat(wrappermanaged-to-native)System.IO.Compression.DeflateStream:CreateZStream(System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)atSystem.IO.Compression.DeflateStream..ctor(System.IO.StreamcompressedStream,CompressionModemode,BooleanleaveOpen,Booleangzip)[0x00000]in<filenameunknown>:0atSystem.IO.Compression.GZipStream..ctor(System.IO.StreamcompressedStream,CompressionModemode,BooleanleaveOpen)[0x00000]in<filenameunknown>:0atConnectDataServer.ConnectServerClass.GetDecompressData(System.Byte[]bytRecv)[0x00000]in<filenameunknown>:0
解决方案
解决方案二:
源码如下///<summary>///接收服务消息///</summary>///<paramname="obj"></param>privatevoidReceiveServerMessage(objectobj){byte[]bytRecv=newbyte[10240000];try{intintRecv=socket.ReceiveFrom(bytRecv,refendSend);if(intRecv>0){byte[]bytData=GetDecompressData(bytRecv);strResult=Encoding.UTF8.GetString(bytData);intintBegin=strResult.IndexOf("<mcuData>");if(intBegin<0){strResult=string.Empty;}else{#region客户端测试XmlDocumentdoc=newXmlDocument();doc.LoadXml(strResult);doc.Save(@"E:AAAXin.xml");intIndex++;#endregion}}}catch{}}privatebyte[]GetDecompressData(byte[]bytRecv){byte[]result=newbyte[10240000];try{//byte[]bytResult=null;MemoryStreamcompressedStream=newMemoryStream(bytRecv);using(MemoryStreamoutStream=newMemoryStream()){using(GZipStreamdecompress=newGZipStream(compressedStream,CompressionMode.Decompress,true)){//decompress.CopyTo(outStream);//result=outStream.ToArray();decompress.Read(result,0,result.Length);}}}catch(Exceptionex){WriteWindowServeLog(ex.Message+"----"+ex.ToString());}returnresult;}
解决方案三:
这个错误的意思就是调用c++代码的时候找不到相应的函数
解决方案四:
引用2楼shingoscar的回复:
这个错误的意思就是调用c++代码的时候找不到相应的函数
然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?
解决方案五:
引用3楼YiQiJinBu的回复:
Quote: 引用2楼shingoscar的回复:
这个错误的意思就是调用c++代码的时候找不到相应的函数然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?
你真的确定是相同的环境?
解决方案六:
引用4楼shingoscar的回复:
Quote: 引用3楼YiQiJinBu的回复:
Quote: 引用2楼shingoscar的回复:
这个错误的意思就是调用c++代码的时候找不到相应的函数然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?
你真的确定是相同的环境?
同一台电脑,同一个DLL,区别就在于我自己写的测试客户端是一个winForm程序,别人的是一个Unity程序的客户端调用我的Dll附上完整类代码usingSystem;usingSystem.IO;usingSystem.IO.Compression;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Xml;namespaceConnectDataServer{publicclassConnectServerClass{privateSocketsocket;privateIPEndPointipe;privateEndPointendSend;privatebyte[]bytSendOrder=newbyte[20];privatestringstrResult=string.Empty;privateintintIndex=0;publicvoidConnectServer(){intport=2000;stringstrHost=GetAddressIP();//"127.0.0.1";//建立IP对象IPAddressip=IPAddress.Parse(strHost);//建立端口对象ipe=newIPEndPoint(ip,port);//创建socket对象socket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);endSend=newIPEndPoint(IPAddress.Any,0);//socket.Bind(ipe);}///<summary>///获取本地IP地址信息///</summary>privatestringGetAddressIP(){///获取本地的IP地址stringAddressIP=string.Empty;foreach(IPAddress_IPAddressinDns.GetHostEntry(Dns.GetHostName()).AddressList){if(_IPAddress.AddressFamily.ToString()=="InterNetwork"){AddressIP=_IPAddress.ToString();}}returnAddressIP;}///<summary>///发送信息///</summary>///<paramname="strSendOrder"></param>publicvoidSendMessage(stringstrSendOrder){bytSendOrder=Encoding.ASCII.GetBytes(strSendOrder);socket.SendTo(bytSendOrder,bytSendOrder.Length,SocketFlags.None,ipe);}///<summary>///接搜消息///</summary>///<returns></returns>publicstringReceiveMessage(){//接收服务器端的返回信息Threadthead=newThread(ReceiveServerMessage);thead.IsBackground=true;thead.Start();returnstrResult;}///<summary>///接收服务消息///</summary>///<paramname="obj"></param>privatevoidReceiveServerMessage(objectobj){byte[]bytRecv=newbyte[10240000];try{intintRecv=socket.ReceiveFrom(bytRecv,refendSend);if(intRecv>0){byte[]bytData=GetDecompressData(bytRecv);strResult=Encoding.UTF8.GetString(bytData);intintBegin=strResult.IndexOf("<mcuData>");if(intBegin<0){strResult=string.Empty;}else{#region客户端测试XmlDocumentdoc=newXmlDocument();doc.LoadXml(strResult);doc.Save(@"E:AAAXin.xml");intIndex++;#endregion}}}catch{}}privatebyte[]GetDecompressData(byte[]bytRecv){byte[]result=newbyte[10240000];try{//byte[]bytResult=null;MemoryStreamcompressedStream=newMemoryStream(bytRecv);using(MemoryStreamoutStream=newMemoryStream()){using(GZipStreamdecompress=newGZipStream(compressedStream,CompressionMode.Decompress,true)){//decompress.CopyTo(outStream);//result=outStream.ToArray();decompress.Read(result,0,result.Length);}}}catch(Exceptionex){WriteWindowServeLog(ex.Message+"----"+ex.ToString());}returnresult;}publicvoidWriteWindowServeLog(stringstrLog){using(FileStreamfs=newFileStream(@"D:LogClass.txt",FileMode.Append)){using(StreamWritersw=newStreamWriter(fs)){sw.WriteLine(strLog);sw.Close();}fs.Close();}}///<summary>///关闭连接///</summary>publicvoidCloseConnectDataServer(){socket.Shutdown(SocketShutdown.Both);socket.Close();}}}
解决方案七:
这就是环境上的区别啊winform是windows自带的运行环境unity是mono的环境
解决方案八:
你考虑下别用.net自带的GZipStream换个第三方的
解决方案九:
引用7楼shingoscar的回复:
你考虑下别用.net自带的GZipStream换个第三方的
试过了,还是不行,但是同样的方法,我把它放到控制台单独跑就没问题,不懂为什么,so,我最后的处理方式是,让Unity调用的那个DLL里生成zip压缩包,然后调另外的exe单独经行解压步骤,功能实现了,但是不知道会不会有什么问题,求指点。。。