1.dll文件应该是C++写的。封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。
跨线程操作引起的?因为我的dll控制的是硬件,应该绑定的是窗体句柄。我操作的时候是在一个事件event中操作的,大家知道event是另开线程的。
于是使用委托解决了以上问题:
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的时候就有卸载选项。
4.如果你用了NativeCode的资源,例如:Com、ActiveX;
没有强制的释放方法,底层的com组件根据你进程调用组件的次数来控制对象的增加和释放(对象释放会延迟,com自身的问题)。
一般是调用强制垃圾回收或ao自带的回收对象的方法,效果不明显。
这种对象不释放的情况,通常出现在应用程序反复调用频率极高的情况下,调用间隔的时间小于对象回收的速度,将报这种错误。
通常是自己的程序写的机构不合理,才会产生这种情况。
自己在程序里强制释放COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉
并在可能出现异常的地方去Catch,并留下日志,转移此异常。
5.指示测试的可执行文件与 Windows 数据执行保护功能兼容。
调用dll的程序,在运行时会出现 “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
有关更多信息,请参见 /NXCOMPAT(与数据执行保护兼容)。
编译器中加入了对DEP的安全性检查,在编译完后的exe文件中取消NXCOMPAT位可解决该问题
editbin.exe /NXCOMPAT:NO myexe
6.排除环境因素:例如.net Fx 2.0和 .net Fx 2.0 SP2差距很大的,当然其他环境因素也好考虑在内。
一定要排除开发和部署环境差异引起的问题。
7.如果是突然出现这个问题,最好是回滚到之前的操作,重做这个操作,例如移除控件,再次添加;
反注册Com,重新注册; 如果你安装了其他插件,卸除这些插件再试一试。
8.程序本身的问题。例如:数据库访问达到最大的并发量,出现死锁。或频繁的写入和读取操作,c#的垃圾回收机制造成的,即变量的回收速度大于使 用的速度造成的,这样就需要从新设计算法。
相关推荐
主要介绍了尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的解决方法,有需要的朋友可以参考一下
c# 内存共享操作,可以创建、读取、写入内存共享区,
C#XML读取写入,C#XML读取写入,C#XML读取写入,
C#基本读取和写入INI配置文件
C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存 C# MemoryStream Memory Stream 写入内存
C# 编写的操作Excel读取/写入动态库(COM/NPOI两种方式),个人推荐使用NPOI方式,因为COM方式存在无法关闭Excel进程的情况(个人体验COM方式效率有点低)。。。已设置0分,资源自取。
读取和写入INI配置文件,熟肉下载即可食用。 string readStr = _file.ReadString("CONFIG", "AAA", "NONE"); _file.WriteString("CONFIG", "BBB", "NONE"); _file.DeleteKey("CONFIG", "CCC");
基于C#语言(WindowForm窗体应用程序示例)实现文本文件读取和写入方法;文件的删除、移动和复制;对文件中的目录文件进行读取显示与删除等操作
可以通过C#读取状态指示灯,可以通过C#读取状态指示灯,可以通过C#读取状态指示灯,可以通过C#读取状态指示灯,
该程序主要实现了从XMl文件中读取数据,并按照要求格式写进Excel表格里面
c#大文件读取和写入数据库(带进度条的源代码).pdf
基于C#的注册表写入和读取数据,可用于数据的保存和读取,使用十分方便!
此源代码用C#语言创建了Excel文档,并进行了读取和写入操作。
C#读取XML文件并写入数据库的三种方法,直接写入和先读取到内存再写入数据库
C#实现DXF文件读取写入 文件描述参考文章:https://mp.csdn.net/mp_blog/creation/editor/122893295
c#从数据库读取写入记事本,直接写入文件
C#文件的读取与写入操作及其读取数据处理(注释详尽,相对路径,直接运行,测试成功!)
读取 写入 读取写入文本文件 读取 写入 读取写入文本文件 注意 out 关键字
成功读取10G文件数据至内存,不是一次性读取。