System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。...
昨天写的RC4的加解密程序,当C#调用C的dll时就会出现这个提示,尝试怎么修改都不行。Debug跟踪显示,应该返回string类型的函数返回值为空。也不知道怎么调试dll,dll里下的断点始终提示无效。单独运行dll里的函数,结果没有问题。几乎可以断定是函数返回的地方出错了。
终于搞清楚错误的真正原因了。诡异的是,这个错误是我趴在桌子上半梦半醒的状态下想到的。更诡异的是,睡醒了之后还记得睡梦中的想法。尝试修改错误,竟然真的就成功了。有点玄......
这个错误其实不应该犯,《C专家编程》和《C陷阱与缺陷》里都提到过,自己也做了这条的笔记。只是之前几乎一样的dll调用都做过,也都成功运行得到了正确的结果,就以为dll里不会出什么错,一直在C#的代码里找错。而且同样的错误提示也见过,只是那时是糊里糊涂的把数组赋个初始值就解决了,也就没太在意。
错误提示:
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。
************** 异常文本 **************
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
在 RC4_GUI.RC4_form.RC4_decrypt(String strings_hex, Int32 start, Int32 length)
在 RC4_GUI.RC4_form.decrypt_button1_Click(Object sender, EventArgs e) 位置 F:\Crypt\Modern Cryptology\GUI\RC4_GUI\Form1.cs:行号 136
在 System.Windows.Forms.Control.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
在 System.Windows.Forms.Button.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** 已加载的程序集 **************
mscorlib
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
RC4_GUI
程序集版本: 1.0.0.0
Win32 版本: 1.0.0.0
基本代码: file:///F:/Crypt/Modern%20Cryptology/GUI/RC4_GUI/bin/Debug/RC4_GUI.exe
----------------------------------------
System.Windows.Forms
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
mscorlib.resources
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Windows.Forms.resources
程序集版本: 2.0.0.0
Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
基本代码: file:///C:/windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHS_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
************** JIT 调试 **************
要启用实时(JIT)调试,
该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
jitDebugging 值。
编译应用程序时还必须启用
调试。
例如:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
启用 JIT 调试后,任何无法处理的异常
都将被发送到在此计算机上注册的 JIT 调试器,
而不是由此对话框处理。
解决方案:
将dll里函数需要返回的局部变量声明为static。(就这么简单。原因就不重复了)
教训:
1、不要犯经验主义的错误,有些经验可能是错误的。
2、发现bug要及时处理,不可为了赶工而忽略。随机性出现的bug更要注意,因为这类bug更难发现,也就更能解决。
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。...相关推荐
- System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
System.AccessViolationException:"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 错误源代码: void CTPMDAdapter::Re ...
- 关于C#调C++dll system.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
关于这个问题真的是太优秀了,找了好久 先来说说我的问题.我是在写独立的一个winform应用程序的时候调用 主要用的StringBuilder lpResutltString类型.是可以成功使用的. ...
- ODA开发/CAD二次开发/C#开发-- “System.AccessViolationException尝试读取或写入受保护的内存,这通常指示其他内存已损坏”异常快速排除思路与建议(踩坑血泪史)
首先开篇强调:这个报错是一个笼统的报错,并不能准确判断异常出现的位置(会冒泡传递)与原因--他的本质相当于"空引用异常". 每个人的情况不同,但是你通过我总结的思路去排查应该可以 ...
- 关闭ArcGIS9.3时 .NET Framework出现尝试读取或写入受保护的内存问题
新安装了ArcGIS9.3,本来学校有正版的授权服务器.但是感觉ESRI赠送给我们的正版软件有几个模块不能用,比如Data Interoperability Tools貌似就没有.于是在网上找破解的方 ...
- C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。常见解决办法
读取或写入受保护 1.dll文件应该是C++写的.封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存.这通常指示其他内存已损坏.错误类型为:System.AccessViola ...
- C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...
C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏.解决方案 报错 dll文件应该是C++写的.封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存.这通常指示其他内存已 ...
- C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException
C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏.System.AccessViolationException 在unsafe模式操作非托管内存的情况下,第一个线程使用完这个对象就把这个对 ...
- c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...
报错 dll文件应该是C++写的.封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存.这通常指示其他内存已损坏.错误类型为:System.AccessViolationExce ...
- asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法...
"System.AccessViolationException"类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存.这通常指示 ...
最新文章
- 技巧:Vim 的纵向编辑模式
- c# 如何设置透明画刷
- 阿里云linux上安装与配置Mysql
- 周鸿祎详解360手机战略:赚钱不靠硬件靠服务
- java 反射抽象_Java实现抽象工厂模式+java的反射的机制
- 【干货】史上最全的Tensorflow学习资源汇总(转)
- 近期解决问题经历和感悟
- 十进制经纬度格式转换度分格式
- 汇新云智慧城市解决方案——以区块链加速智慧城市建设
- IDEA 不检查语法错误问题
- Unity 3D中实现敌人追踪
- SU操作说明--SU格式转SEGY格式
- C语言:求高次方数的尾数
- 【promise】什么是promise?
- Oracle安装时物理内存检查失败的解决方案:
- FLASH小游戏:魔兽元素TD
- docker拉取(下载)数据太慢,docker pull xxxx一直卡着。
- 程序员是呆在一个公司等涨工资好,还是跳槽涨工资好?
- ip地址转换数字函数 iton_c# – RabbitMQ CreateConneciton问题 – 在一个应用程序中运行,但在另一个应用程序中运行...
- 斯坦福大学 Design School 所倡导设计思维的原则和步骤是什么?