【问题标题】:AccessViolationException and Faulting module: What is causing this exception? Is it the faulting module?AccessViolationException 和故障模块:是什么导致了这个异常?是模块故障吗?
【发布时间】:2012-09-12 19:36:36
【问题描述】:

如果发生 AccessViolationException,与它相关的故障模块是否意味着它是该模块中的一个错误,在我们的例子中,它恰好是我们的第三方 DLL 之一?或者这是一个更复杂的问题?我们已经联系了这个模块的制造商,但他们没有发现任何错误,只是暗示可能的堆栈损坏意味着什么。但是,根据事件日志,特定的故障模块始终与 AccessViolationException 相关联。那么这件事的真相是什么?是有问题的第三方 DLL 模块还是其他什么?

背景

我们在 IIS 7 上运行的 .NET WCF Web 服务中使用受互斥体保护的 VB6 STA COM 对象。最近我们检测到随机 System.AccessViolationException 错误(由该对象引起)使 Web 服务完全崩溃,我们'此刻我们非常无助,因为我们已经尽一切努力使这个 COM 对象与 Web 服务一起工作。服务本身已使用以下指南设置为在 STA 模式下运行:(http://scottseely.com/2009/07/17/calling-an-sta-com-object-from-a-wcf-operation/

谢谢

【问题讨论】:

  • 能否提供完整的例外情况?

标签: wcf com vb6 access-violation sta


【解决方案1】:

这可能与线程终止时的 VB6 运行时泄漏有关。 VB6 ActiveX DLL 项目具有“无人参与执行”和“保留在内存中”选项,它们试图通过尽可能长时间地保持 STA 线程上的运行时间来缓解这些问题。询问您的供应商这些选项是否适用于他们的组件。

在任何一种情况下,最好的办法是阻止这些 STA 线程终止,实现它们的池(或在单个 STA 线程上序列化),以便 VB6 运行时不会尝试拆除它的内部结构时间(以及泄漏句柄/内存/TLS)。

在 COM+/MTS 下搜索使用 VB6 组件,可能会找到有价值的建议。祝你好运!

【讨论】:

  • 感谢您的建议。如果我们使用静态 COM 对象会有什么不同吗?目前,我们总是在创建 COM 组件的新实例(受互斥体保护)。我读过在线程终止期间不会删除静态变量,它只会成为 IIS 回收的问题。
猜你喜欢
  • 2018-11-29
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2013-01-16
  • 2013-06-10
相关资源
最近更新 更多