0

我正在使用 .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())

我的应用程序不再以这种方式崩溃。我在网上搜索了我的行为的理由,因为当某些东西有效时,我想知道它为什么有效。一无所获,我决定发布这个问题。有人可以告诉我为什么我所做的工作有效,并指导我阅读一些有关此主题的更多信息的文献吗?

4

0 回答 0