首页 新闻 会员 周边

System.AccessViolationException was unhandled

0
悬赏园豆:50 [已解决问题] 解决于 2010-09-01 12:52

背景介绍:

.Net项目引用了一个VB写的COM组件,在.Net中实现了COM组件一个事件的处理。调试时,事件处理方法没有出错,事件处理文法一结束,就出了以下错误。请大家帮忙解答一下,非常感谢!

异常日志:

System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
  Source="System.Windows.Forms"
  StackTrace:
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageA(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32

dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at TT.Client.TestApp.Program.Main() in E:\WorkSpace\TT\TT.TestApp\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

问题补充: 原因找到了:是VB Com中的数据传到.Net事件处理方法后,可能被.Net垃圾回收了,VB Com中再处理这个数据时出错了。在VB中重新获取数据后,可解决此问题。
Jack Tang的主页 Jack Tang | 初学一级 | 园豆:45
提问于:2010-08-19 20:08
< >
分享
最佳答案
0

这是你的COM 组件内部有bug,访问内存越界了,很可能是函数在堆栈中的返回指针被冲掉了,所以函数调用结束后会出错。

收获园豆:25
eaglet | 专家六级 |园豆:17139 | 2010-08-20 07:41
COM 组件在纯VB程序中使用是没有问题的,在.Net环境引用才出这样的问题
Jack Tang | 园豆:45 (初学一级) | 2010-08-20 14:27
其他回答(2)
0

试下 设置 VS  :

工具-> 选项->调试->找到“在模块加载时取消 JIT 优化(仅限托管)”这项 不勾选; 确定,如下图:

不勾选下图 红色标记的选项:

收获园豆:10
HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-19 20:33
不勾选那个选项,还是有同样的问题
支持(0) 反对(0) Jack Tang | 园豆:45 (初学一级) | 2010-08-20 14:25
0

你在VB中能正常调用你的COM组件的事件吗?

收获园豆:15
Launcher | 园豆:45045 (高人七级) | 2010-08-19 21:38
可以的。VB组件已经用了很多年。
支持(0) 反对(0) Jack Tang | 园豆:45 (初学一级) | 2010-08-19 22:59
@Jack Tang:可能在于你的事件Handler的 CallingConvention 的选择上.
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-20 10:42
事件Handler的 CallingConvention 的选择 -- 这个能说明白一点吗?
支持(0) 反对(0) Jack Tang | 园豆:45 (初学一级) | 2010-08-20 14:28
@Jack Tang:一两句也说不明白,我先写个demo吧!
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-20 14:58
@Jack Tang:我写了几个例程重现你遇到的错误,对于COM事件,只有放在UI线程中,它才报错。我初步估计的原因在于UI线程会进入WinProc消息循环所致,具体原因尚不明了。我再调试下。
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-20 16:04
你别急哈!我基本已经知道什么问题了,这个问题我以前也碰到过,就是delegate在非托管代码中的回调问题,因为以前那个项目谈崩了,所以后来也没再解决,你的这个问题解决了,前一阵子那个问matlab的同学问题也就解决了。
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-20 22:17
先谢谢了
支持(0) 反对(0) Jack Tang | 园豆:45 (初学一级) | 2010-08-21 16:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册