在我为公司开发的 vb.net 应用程序中,我在过去两周内遇到了令人沮丧的错误。
该应用程序包含一个基本界面( Windows窗体应用程序),用于获取一些数据(文件路径和坐标),然后处理来自在外部应用程序中建模的钢结构的大量信息 Staad.Pro (在石油和天然气行业很常见)和几个 Excel 文件。
因此它从两个来源获取外部信息:
该申请已令人满意地使用了三年。我最近做了一些更改,以使用外部Excel文件介绍数据的后台进程和每个项目公司的配置定义,该文件以前是在代码级别定义的。
此配置文件直接在Excel中打开应用程序实例(Excel),而其他Excel文件则使用ADO打开,如前所述。同时,配置文件路径在单个文本文件中定义,应用程序始终使用它来读取该路径,可以使用应用程序通过OpenFileDialog
对象修改内容。
我特别指定了那些点,因为它们是我在错误发生之前所做的更改。由于我的假期,已经有两周不活动了,在此期间发布了一些Windows更新(我想其中一些与流行的勒索软件 Wannacry 和 Petya 相关)。
因此,我在VS Community 2015中运行应用程序的错误消息如下:
“System.AccessViolationException”类型的未处理异常 发生在mscorlib.dll。
其他信息:尝试阅读或 写保护的内存。这通常表明其他记忆 是腐败的。
当应用程序使用以下代码打开第二个ADO connectionn到Excel文件时出现:
cnn1.Open("Provider=Microsoft.ace.OLEDB.12.0;" &
"Data Source=" & rutaarchivo & ";" &
"Extended Properties=""Excel 12.0;HDR=Yes"";")
第一个连接已关闭,相应的对象设置为Nothing
。我改变了访问此文件的方式,试图理解错误,避免了ADO,但是在以后连接到另一个带有ADO的Excel文件时再次出现错误,这也是更改后的第二个ADO连接。
错误是随机出现的,当这个项目刚刚在VS Community 2015中打开,然后第一次运行时,不会出现错误(通常),但是会在第二次执行后出现错误。
其他时候,在调用子程序时出现错误,该子程序使ADO与Excel文件连接,而不是在子程序本身的代码中,并使用不同的消息:
托管调试助手'FatalExecutionEngineError'检测到了 (路径)中的问题。
附加信息:遇到运行时 一个致命的错误。在线程上,错误的地址是0x79f387d1 0x168c。错误代码是0xc0000005。这个错误可能是一个错误 CLR或用户代码的不安全或不可验证部分。共同 此错误的来源包括COM-interop或用户封送错误 PInvoke,可能会破坏堆栈。
在查找错误模式时,我发现当我第二次使用openstaad.dll库的相同类型的对象时出现另一个错误,并显示以下消息:
“System.Runtime.InteropServices.COMException”类型的异常 发生在Microsoft.VisualBasic.dll但未在用户代码中处理 其他信息:Lamemoriaestábloqueada。 (Excepciónde HRESULT:0x8002000D(DISP_E_ARRAYISLOCKED))
我在互联网上发现了两篇关于此错误的主要文章(System.AccessViolationException):
Programs randomly getting System.AccessViolationException
https://www.codeproject.com/Questions/106826/OpenFileDialog-OleDbConnection-AccessViolationExce
我尝试重新安装Access数据库引擎,以定义提到的环境变量并更改 .NET Framework 版本。什么都行不通。
任何帮助解决这个问题都将不胜感激。
Alberto Ruiz
答案 0 :(得分:-1)
我在第二次使用Microsoft.ACE.OLEDB.12.0连接后,最近遇到了同样的错误,在这种情况下,MS Access。
对我有帮助的是将连接包装在一个新线程中。
例如:如果打开连接的有问题的代码位于方法OpenExcel
中,则可以执行以下操作:
(new Thread(() => OpenExcel())).Start();
希望这有帮助。