C#:AccessViolationException: 尝试读取或写入受保护的内存。这通常指

2016-12-08 17:32    点击:    

各种此类错误解决办法的收集:

1. 

情景:C#调用C的dll时出现这个提示  

解决办法:将dll里函数需要返回的局部变量声明为static

2.

情景:处理图片时越界 调用C或C++等直接操作内存的库文件

解决办法:参阅BItMap类,有LockBytes()之类的低级操作方法。

3.

情景:图像处理,COM开发

解决办法:

(1).如果你用了NativeCode的资源,例如:Com、ActiveX;
没有强制的释放方法,底层的com组件根据你进程调用组件的次数来控制对象的增加和释放(对象释放会延迟,com自身的问题)。
一般是调用强制垃圾回收或ao自带的回收对象的方法,效果不明显。这种对象不释放的情况,通常出现在应用程序反复调用频率极高的情况下,调用间隔的时间小于对象回收的速度,将报这种错误。通常是自己的程序写的机构不合理,才会产生这种情况。自己在程序里强制释放COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉并在可能出现异常的地方去Catch,并留下日志,转移此异常。

(2).指示测试的可执行文件与 Windows 数据执行保护功能兼容。
调用dll的程序,在运行时会出现 “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"有关更多信息,请参 /NXCOMPAT(与数据执行保护兼容)。编译器中加入了对DEP的安全性检查,在编译完后的exe文件中取消NXCOMPAT位可解决该问题editbin.exe /NXCOMPAT:NO myexe

(3).排除环境因素:例如.net Fx 2.0和 .net Fx 2.0 SP2差距很大的,当然其他环境因素也好考虑在内。
一定要排除开发和部署环境差异引起的问题。 尝试修改.net 4.5降低为.net 3.5效果立竿见影 。特别是针对emguCV 3.

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

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


4.我遇到的这个比较奇怪,幸亏做了备份,用原来备份的C++程序重新生成,就能够使用了。shit.

本文仅代表作者观点,不代表本网站立场