已解决C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏(含常见解决办法)

这篇具有很好参考价值的文章主要介绍了已解决C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏(含常见解决办法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

c# 尝试读取或写入受保护的内存,项目踩坑,c#,开发语言,解决bug,bug调试,内存已损坏

一、Bug描述

c# 尝试读取或写入受保护的内存,项目踩坑,c#,开发语言,解决bug,bug调试,内存已损坏

今天遇到了一个bug,C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。

二、定位报错点及解决方案

情况1:读取或者写入受到了保护

话不多说,直接上定位报错点及原因!

c# 尝试读取或写入受保护的内存,项目踩坑,c#,开发语言,解决bug,bug调试,内存已损坏

1.dll文件应该是C++写的。封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。

跨线程操作引起的?因为dll控制的是硬件,应该绑定的是窗体句柄。我操作的时候是在一个事件event中操作的,大家知道event是另开线程的。

于是使用委托解决了以上问题:

C#代码
private delegate void CloseDevDelegate();


    private void CloseDev()  
    {  
        if (this.InvokeRequired)  
        {  
            CloseDevDelegate closeDev = new CloseDevDelegate(CloseDev);  
            this.BeginInvoke(closeDev);  
        }  
        else  
        {  
            Program.DEVICE.CloseDev();  
        }  
    }  

在事件中使用:CloseDev()

大功告成!原来是跨线程操作com口引起的错误。

情况2:调用出现问题

在C#中调用别人的DLL的时候有时候出现 尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。

在传值的时候还是用指针,再在C#中做转换就好了。

将如下代码修改:


[DllImport("APPLISTCC.dll")]  
public static extern string TestFunc1(string param1);  
  
string ret1 = TestFunc1("text");  

修改后:


[DllImport("APPLISTCC.dll")]  
public static extern IntPtr TestFunc1(IntPtr par1);  
  
IntPtr ptrIn = Marshal.StringToHGlobalAnsi("text");  
IntPtr ptrRet = TestFunc1(ptrIn);  
string retlust = Marshal.PtrToStringAnsi(ptrRet);  

自己在程序里强制释放COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉

情况3:添加控件出现问题

很多人用C#编程的时候会碰到这个问题。代码一点都没写,只是添加了一个控件,调试就会出现AccessViolationException这个错误。

SharpDevelop的错误提示:


Unhandled exception
An exception of type System.AccessViolationException was thrown:
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

这个其实不是什么系统兼容性问题,是软件冲突。

VS和ATI显卡的软件catalyst control center冲突。

把catalyst control center卸载,问题就解决了。

重新安装catalyst control cente的时候就有卸载选项。

四、注意事项及原理

如果你用了NativeCode的资源,例如:Com、ActiveX;没有强制的释放方法,底层的com组件根据你进程调用组件的次数来控制对象的增加和释放(对象释放会延迟,com自身的问题)。

一般是调用强制垃圾回收或ao自带的回收对象的方法,效果不明显。

这种对象不释放的情况,通常出现在应用程序反复调用频率极高的情况下,调用间隔的时间小于对象回收的速度,将报这种错误。

通常是自己的程序写的机构不合理,才会产生这种情况。

自己在程序里强制释放COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉并在可能出现异常的地方去Catch,并留下日志,转移此异常。

指示测试的可执行文件与 Windows 数据执行保护功能兼容。

调用dll的程序,在运行时会出现 “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"

有关更多信息,请参见 /NXCOMPAT(与数据执行保护兼容)。

编译器中加入了对DEP的安全性检查,在编译完后的exe文件中取消NXCOMPAT位可解决该问题
editbin.exe /NXCOMPAT:NO myexe

也有可能是程序本身的问题:例如:数据库访问达到最大的并发量,出现死锁。或频繁的写入和读取操作,c#的垃圾回收机制造成的,即变量的回收速度大于使 用的速度造成的,这样就需要从新设计算法。

如果是突然出现这个问题,最好是回滚到之前的操作,重做这个操作,例如移除控件,再次添加;
反注册Com,重新注册; 如果你安装了其他插件,卸除这些插件再试一试。

总结:写在后面的话

Hello,各位看官老爷们好,洲洲已经建立了技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。
📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体变现、前沿科技文章分享、论文精读等等。
📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有
📝网络的风口只会越来越大,风浪越大,鱼越贵!欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!
📝关注我的公众号(与CSDN同ID:程序员洲洲)可以获得一份Java 10万字面试宝典及相关资料!~

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~ 跳转链接社区~

c# 尝试读取或写入受保护的内存,项目踩坑,c#,开发语言,解决bug,bug调试,内存已损坏文章来源地址https://www.toymoban.com/news/detail-583882.html

到了这里,关于已解决C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏(含常见解决办法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包