0

如果发生 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/

谢谢

4

1 回答 1

0

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

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

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

于 2012-09-13T08:49:57.277 回答