vb.net передает переменные в общих подпрограммах

Public Shared _formRef As frmMain
Public Shared f As frmMain

    Class Server
        <STAThread()> 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(ByVal sender As Object, ByVal e As StringMessageEventArgs)
            _formRef = f

            LANResponse = Convert.ToString(e.Message)
            Dim lanSent As String() = Nothing
            Dim sep(3) As Char
            Dim s As String = ""

            sep(0) = "~"
            'sep(1) = ","
            lanSent = LANResponse.Split(sep, 2)

            Dim a As New Threading.Thread(AddressOf getStatus)

            a.SetApartmentState(Threading.ApartmentState.STA)
            a.Start(Trim(lanSent(0)) & Trim(lanSent(1)))
   End Sub
End Class

Class Sending
        Public Shared Sub Main(ByRef whatToWrite As String)
            Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
            Dim anOutputChannel As IOutputChannel = aTcpMessaging.CreateOutputChannel(theIPforVM & ":" & thePort)
            Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
            Dim aStringMessageSender As IStringMessageSender = aStringMessagesFactory.CreateStringMessageSender()

            aStringMessageSender.AttachOutputChannel(anOutputChannel)
            aStringMessageSender.SendMessage(whatToWrite)
        End Sub
End Class

    Private Shared Sub getStatus(ByVal data As Object)
        _formRef.UpdateLabelText("Static: " & data)
    End Sub

    Public Sub UpdateLabelText(ByVal text As String)
        If Me.lblStatus.InvokeRequired Then
            Me.lblStatus.Invoke(New Action(Of String)(AddressOf UpdateLabelText), New Object() {text})
        Else
            Me.lblStatus.Text = text
        End If
    End Sub

#Region "Form Load"
    <STAThread()> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Call Server.Main()
        '--------------------------------
        isTesting = False
        lblVer.Text = "V.7"
        '--------------------------------
    End Sub
#End Region

но после запуска кода я получаю сообщение об ошибке, которое вы видите на моем изображении

ошибка

Но, как ни странно, я передаю значение, которое ищу:

ошибка 2

1 ответ

Решение

Вы никогда не назначаете запущенный экземпляр frmMain совместно используемым переменным.

Если вы измените свой основной метод сервера на:

    <STAThread()> Public Shared Sub Main(formRef As frmMain)
        f = FormRef

и затем измените ваш вызов на этот метод:

Call Server.Main(Me)

Тогда это должно решить вашу проблему (при условии, что Server.Main вызывается из frmMain).

Другие вопросы по тегам