我正在使用 .NET 的第 3 方 Activex 控件。通过添加对 ActiveX ocx 的引用并将控件拖到我的表单上,我成功地创建了 RCW(AxInterop.ACMELib.dll 和 Interop.ACMELib.dll)。
此时,缺少 RCW 提供的接口,我决定创建自己的组件作为附加包装器。一个原因是我从多个线程访问 RCW,并且我想一次将对 RCW 的访问同步到一个线程。我的课看起来像:
Public Class ACMEWrapper ' my Component
Inherits AxACMELib.ACMEClass
Public Overrides Function GetData() As Int()
Dim result As Int()
Try
SyncLock LockACMEObject
result = MyBase.GetData()
End SyncLock
Return result
Catch
' log exception, etc.
End Try
End Function
这个类在大多数情况下都能正常工作。但是,有时我的应用程序崩溃而没有我的应用程序可以处理的异常。甚至来自一个包罗万象的未处理异常处理程序。在某些情况下,它实际上确实捕获了“外部组件已引发异常......”,我无法从中恢复。
我以为我已经尝试了一切,直到一时兴起,我在创建它的线程上明确调用了对 RCW 的所有调用,即
MyBase.Invoke(Sub() result = MyBase.GetData())
我的应用程序不再以这种方式崩溃。我在网上搜索了我的行为的理由,因为当某些东西有效时,我想知道它为什么有效。一无所获,我决定发布这个问题。有人可以告诉我为什么我所做的工作有效,并指导我阅读一些有关此主题的更多信息的文献吗?