求教如何解决C#调用C++ DLL出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误

问题描述

我正在编写设备处理程序,使用C++写的DLL,其中一个部分需要用到回调函数。现在遇到的问题是使用InitDevice()函数后,回调函数能够正常运行获取返回数据,但是随后调用Close()函数,就会导致系统报出“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误。使用了N种方式也没有解决这个问题,有哪位高手能够帮帮忙啊!C++函数原形如下:extern"C"__declspec(dllexport)HANDLE__stdcallLogin(constchar*chDevIP,unsignedintnDevPort,constchar*chUserName,constchar*chPasswd);extern"C"__declspec(dllexport)void__stdcallSetCallBack(constchar*chDevType,//设备类型RealDataCallBackfnCallBack,//回调函数constchar*szLocalIp,//本机ipconstchar*szDevIp,//设备ipWORDiChannel,//通道编号UINTTransmode,//传输方式HANDLEhUserHandle);//登陆句柄extern"C"__declspec(dllexport)bool__stdcallLogout(HANDLEhUserHandle);我的C#定义://登录设备[DllImport("device.dll",EntryPoint="Login")]publicunsafestaticexternIntPtrLogin(stringstrDevIP,uintiDevPort,stringstrUserName,stringstrPasswd);//设置回调[DllImport("device.dll",EntryPoint="SetCallBack")]publicunsafestaticexternvoidSetCallBack(stringstrDevType,[MarshalAs(UnmanagedType.FunctionPtr)]RealDataCallBackfnCallBack,stringstrLocalIp,stringstrDevIp,uintiChannel,uintiTransmode,IntPtrlHandle);//退出登录,其中调用了SetCallBack函数将回调函数设置为NULL[DllImport("device.dll",EntryPoint="Logout")]publicunsafestaticexternvoidLogout(IntPtrlHandle);///定义回调接口publicunsafedelegateboolRealDataCallBack(IntPtrobjPr,intiLen);privateRealDataCallBack_fnCallBack;_fnCallBack=newRealDataCallBack(this.BroadcastMessage);publicvoidInitDevice(){//登录设备_lHandle=Login(_objDevInfo.DeviceIP,_objDevInfo.DevicePort,_objDevInfo.User,_objDevInfo.Password);if(_lHandle.ToInt32()>0){SetCallBack(_objDevInfo.DeviceType,_fnCallBack,_objLocalAddress.ToString(),_objDevInfo.DeviceIP,_objDevInfo.Channel,_objDevInfo.TransMode,_lHandle);}else{throw(newApplicationException("登录设备失败."));}}privateboolBroadcastMessage(IntPtrobjPr,intiLen){try{byte[]byteData=newbyte[iLen];Marshal.Copy(objPr,byteData,0,iLen);//以下做数据处理工作returntrue;}catch(Exceptionex){//失败处理}}//关闭设备publicvoidClose(){try{if(_lHandle.ToInt32()>0){//退出设备登录Logout(_lHandle);}}catch(Exceptionex){throw(ex);}finally{_lHandle=(IntPtr)(-1);}}

解决方案

解决方案二:
参数类型改了把ref去掉或者允许不安全代码
解决方案三:
[unsafe]
解决方案四:
如果按照你这么所说的话我想应该是c#分配的deleage地址。在c里面只能访问不能操作吧没有遇到你这样的问题。呵呵。也不知道你c里面怎么写的
解决方案五:
我一直认为问题是出现在回调函数使用上,但是一直找不到原因,所以需要高手们帮忙!
解决方案六:
而且只要出现内存错误情况后,再次调用SetCallBack函数,就会直接出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误。真是郁闷啊!请高手们快快出招!!!
解决方案七:
我顶

时间: 2024-09-13 17:06:47

求教如何解决C#调用C++ DLL出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误的相关文章

dll c#-c#调用c++的dll出现尝试读取或写入受保护的内存问题

问题描述 c#调用c++的dll出现尝试读取或写入受保护的内存问题 使用c#调用c++的一个dll.c++的接口函数为: extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); 参数IDetManager为一个结构体: struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0

C#调用Haskell时的“尝试读取或写入受保护的内存”问题

最近一直被C#调用Haskell时的"尝试读取或写入受保护的内存"问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C#调用haskell时的"尝试读取或写入受保护的内存"问题),而且困在其中,越陷超深,无法自拔,差点弃用C#解决我们面临的问题. 问题是这样的,只要在Haskell代码中对字符串进行操作,在C#调用时就会引发异常: An unhandled exception of ty

C#调用c写的dll 出现:尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 求助各位大神!我最近在用C#封装一个C写的dll,在调dll中的方法时,时不时会报"尝试读取或写入受保护的内存.这通常指示其他内存已损坏".出现这样的问题,重启下机器就会好了,不过这也不是解决方案,继续大神帮我看看,如何才能杜绝这个问题.char*__readPeopleInfo_json()这个是C写的dll中的方法定义下面是C#引用及调用的代码[DllImport("HealthyCarder.dll")]publicstaticexternIntPt

c#调c++dll,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 调用时尝试读取或写入受保护的内存.这通常指示其他内存已损坏.不知道是什么情况,网上好多都是c++Long对应c#int,但是我已经转了还是没用,这代码一开始时可以用的,我重装了win7系统后就运行不了了....求大神帮忙c++:extern"C"__declspec(dllexport)BOOL__stdcallTCR_OpenReader(longnPort){if(1==g_iProtocol){g_CardReader.CreateInterface("1.d

dll结构体-C#调用DLL结构体,第一次成功,第二次的时候就报错。尝试读取或写入受保护的内存。

问题描述 C#调用DLL结构体,第一次成功,第二次的时候就报错.尝试读取或写入受保护的内存. C++代码 typedef struct tagIDCardData{ char Name[32]; //姓名 char Sex[6]; //性别 char Nation[20]; //名族 char Born[18]; //出生日期 char Address[72]; //住址 char IDCardNo[38]; //身份证号 char GrantDept[32]; //发证机关 char User

c++-C# 调用C++ dll是出现这样的错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C# 调用C++ dll是出现这样的错误"尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 调试时是这样的: SDK上是这样说明的: 我调用这个dll时是这样的: 困扰了很久,希望有大神来看一看,感激不敬 解决方案 C#尝试读取或写入受保护的内存.这通常指示其他内存已损坏.C# 尝试读取或写入受保护的内存 .这通常指示其他内存已损坏.C#尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 解决方案二: 先看是不是你的参数有问题,然后就是数据对不对 解决方案三: 是不是重复调用

求助,C#调用C++dll时提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C++dll的头文件接口描述如下:#pragmapack(push,1)typedefstructXCtrlStatus{XCtrlStatus(unsignedlongV=0){*reinterpret_cast<unsignedlong*>(this)=V;}unsignedcharERR:1;unsignedcharAUTO:1;unsignedcharRUN:2;unsignedcharDIR:2;unsignedchar:1;unsignedchar:1;unsignedc

c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存

问题描述 c#调用delphi编写的dll文件报错,尝试读取或写入受保护的内存 delphi函数原型 Procedure invoke(params :PChar; result : PChar) ; 解决方案 把这个delphi的原型改一下,改为 Function Pchar invoke(params :PChar) ; 再试试 解决方案二: Function invoke(params: PAnsiChar): PAnsiChar ;

C# 调用C++的DLL文件出现问题。尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 我用C#开发一个项目,需要饮用C++的DLL,但是调用其中的方法是有几个函数正常,有一些方法总是报错.错误为:"尝试读取或写入受保护的内存.这通常指示其他内存已损坏."哪位大神可以帮我看看.这是DLL中的方法:typedefstructehInformation{std::stringehfilename;std::stringmark;//eh头文件的标示std::stringsendAddr;//eh头文件的发送地址std::vector<std::string&g