昨天写的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: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。...相关推荐

  1. System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

    System.AccessViolationException:"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 错误源代码: void CTPMDAdapter::Re ...

  2. 关于C#调C++dll system.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    关于这个问题真的是太优秀了,找了好久 先来说说我的问题.我是在写独立的一个winform应用程序的时候调用 主要用的StringBuilder lpResutltString类型.是可以成功使用的. ...

  3. ODA开发/CAD二次开发/C#开发-- “System.AccessViolationException尝试读取或写入受保护的内存,这通常指示其他内存已损坏”异常快速排除思路与建议(踩坑血泪史)

     首先开篇强调:这个报错是一个笼统的报错,并不能准确判断异常出现的位置(会冒泡传递)与原因--他的本质相当于"空引用异常". 每个人的情况不同,但是你通过我总结的思路去排查应该可以 ...

  4. 关闭ArcGIS9.3时 .NET Framework出现尝试读取或写入受保护的内存问题

    新安装了ArcGIS9.3,本来学校有正版的授权服务器.但是感觉ESRI赠送给我们的正版软件有几个模块不能用,比如Data Interoperability Tools貌似就没有.于是在网上找破解的方 ...

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

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

  6. C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...

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

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

    C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏.System.AccessViolationException 在unsafe模式操作非托管内存的情况下,第一个线程使用完这个对象就把这个对 ...

  8. c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...

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

  9. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法...

    "System.AccessViolationException"类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存.这通常指示 ...

最新文章

  1. 技巧:Vim 的纵向编辑模式
  2. c# 如何设置透明画刷
  3. 阿里云linux上安装与配置Mysql
  4. 周鸿祎详解360手机战略:赚钱不靠硬件靠服务
  5. java 反射抽象_Java实现抽象工厂模式+java的反射的机制
  6. 【干货】史上最全的Tensorflow学习资源汇总(转)
  7. 近期解决问题经历和感悟
  8. 十进制经纬度格式转换度分格式
  9. 汇新云智慧城市解决方案——以区块链加速智慧城市建设
  10. IDEA 不检查语法错误问题
  11. Unity 3D中实现敌人追踪
  12. SU操作说明--SU格式转SEGY格式
  13. C语言:求高次方数的尾数
  14. 【promise】什么是promise?
  15. Oracle安装时物理内存检查失败的解决方案:
  16. FLASH小游戏:魔兽元素TD
  17. docker拉取(下载)数据太慢,docker pull xxxx一直卡着。
  18. 程序员是呆在一个公司等涨工资好,还是跳槽涨工资好?
  19. ip地址转换数字函数 iton_c# – RabbitMQ CreateConneciton问题 – 在一个应用程序中运行,但在另一个应用程序中运行...
  20. 斯坦福大学 Design School 所倡导设计思维的原则和步骤是什么?

热门文章

  1. Java-PDF添加水印【文字或图片】,使用Spire.PDF for Java
  2. 使用 NSIS 制作软件安装包
  3. 国内10大物联网公司排行榜,求职必备‼️
  4. The Google File System 中文版论文(上)(转载)
  5. Android集成PayPal
  6. Python3+Django2集成PayPal(贝宝)跨境支付三方接口以及订单查询和退款业务
  7. sql语句优化技巧 sql 语句技巧
  8. VI编辑器_终端编辑器(命令整理)
  9. Android蓝牙开发的一些经验
  10. 如何恢复电脑故障文件数据