ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中

Ste*_*hRT 4 browser vb.net activex

当我尝试显示其中包含网络浏览器的表单时,出现此错误。

ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中

我通过以下方式调用它:

Public Class frmMain
  Class Server
       Public Shared Sub Main()
        Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
        Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
        Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
        Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
        AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

        aStringMessageReceiver.AttachInputChannel(anInputChannel)
    End Sub

       Private Shared Sub StringMessageReceived()
            Call New frmMM().Show()
       End Sub
  End Class

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim RelState As Integer = 0
    Call frmMain.Server.Main()
    lblVer.Text = "V.7"
    Pid = 0
  End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

我怎样才能加载它,这样它就不会显示该错误?

谢谢。

大卫

代码更新

 Class Server
    <STAThread()> Public Sub Main()
        Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
        Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
        Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
        Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
        AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

        aStringMessageReceiver.AttachInputChannel(anInputChannel)
    End Sub

   Private Shared Sub StringMessageReceived()
        Call New frmMM().Show()
   End Sub
 End Class

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim RelState As Integer = 0
    Call frmMain.Server.Main()   '<-- the error now
    lblVer.Text = "V.7"
    Pid = 0
  End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

小智 5

出现此问题的原因是 UI 组件是在非 UI 线程上创建的。这是代码的简化版本,它将因此错误消息而中断。

Imports System.ComponentModel

Public Class Form1
    Private _ThreadedProcesss As ThreadedProcess
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _ThreadedProcesss = New ThreadedProcess()
        _ThreadedProcesss.Start()
    End Sub

    Public Class ThreadedProcess
        Private _thread As System.Threading.Thread

        Public Sub Start()
            _thread = New System.Threading.Thread(AddressOf ThreadEntryPoint)
            _thread.Name = "Testing thread"
            _thread.Start()
        End Sub

        Private Sub ThreadEntryPoint(status As Object)
            Dim wb As New WebBrowser()
            wb.Dock = DockStyle.Fill
            wb.Visible = True
            wb.DocumentText = "Hello world"
        End Sub
    End Class
End Class
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您只需在创建控件之前返回到 UI 线程即可。

Imports System.ComponentModel

Public Class Form1
    Private _ThreadedProcesss As ThreadedProcess
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _ThreadedProcesss = New ThreadedProcess(New EventHandler(AddressOf ThreadedProcess_Create))
        _ThreadedProcesss.Start()
    End Sub

    Private Sub ThreadedProcess_Create(sender As Object, e As System.EventArgs)
        If (Me.InvokeRequired) Then
            Me.Invoke(New EventHandler(AddressOf ThreadedProcess_Create), {sender, e})
        Else
            Dim wb As New WebBrowser()
            Me.Controls.Add(wb)
            wb.Dock = DockStyle.Fill
            wb.Visible = True
            wb.DocumentText = "Hello world"
        End If
    End Sub

    Public Class ThreadedProcess
        Private _thread As System.Threading.Thread
        Private _callback As EventHandler

        Public Sub New(callback As EventHandler)
            _callback = callback
        End Sub

        Public Sub Start()
            _thread = New System.Threading.Thread(AddressOf ThreadEntryPoint)
            _thread.Name = "Testing thread"
            _thread.Start()
        End Sub

        Private Sub ThreadEntryPoint(status As Object)
            _callback.Invoke(Me, EventArgs.Empty)
        End Sub
    End Class
End Class
Run Code Online (Sandbox Code Playgroud)

因此,对于您的示例,我相信代码将是:

 Class Server
    Private _callback as EventHandler
    Public Sub Main(callback as EventHandler)
        _callback = callback
        Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
        Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
        Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
        Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
        AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

        aStringMessageReceiver.AttachInputChannel(anInputChannel)
    End Sub

    Private Sub StringMessageReceived()
        _callback.Invoke(Me, EventArgs.Empty)
    End Sub
  End Class

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      Dim RelState As Integer = 0
      Call frmMain.Server.Main(new EventHandler(AddressOf Server_MessageReceived))   '<-- the error now
      lblVer.Text = "V.7"
      Pid = 0
  End Sub
  Private Sub Server_MessageReceived(sender as Object, e As EventArgs)
      If (Me.InvokeRequired) Then
          Me.Invoke(New EventHandler(AddressOf Server_MessageReceived), {sender, e})
      Else
          Call New frmMM().Show()
      End If
  End Sub
End Class
Run Code Online (Sandbox Code Playgroud)