我正在使用.NET的第三方Activex控件。我已成功创建了RCW(AxInterop.ACMELib.dll和Interop.ACMELib.dll),方法是添加对ActiveX ocx的引用并将控件拖到我的表单上。
此时,RCW提供的接口缺乏,我决定创建自己的Component作为附加包装器。一个原因是我从许多线程访问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
这个类在大多数情况下都能正常工作。但是,有时我的应用程序崩溃时没有可以由我的应用程序处理的异常。甚至不是来自catch-all未处理的异常处理程序。在某些情况下,它确实会捕获“外部组件抛出异常...”,我无法从中恢复。
我以为我已经尝试了一切,直到我明确地在它创建的线程上调用RCW的所有调用,即
。MyBase.Invoke(Sub() result = MyBase.GetData())
我的应用程序不再以这种方式崩溃。我在网上搜索了我的行为的理由,因为什么时候有用,我想知道为什么它有效。一无所获,我决定发布这个问题。有人可以告诉我为什么我的工作是有效的,并引导我阅读一些有关这个主题的更多信息的文献吗?