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
но после запуска кода я получаю сообщение об ошибке, которое вы видите на моем изображении
Но, как ни странно, я передаю значение, которое ищу:
1 ответ
Решение
Вы никогда не назначаете запущенный экземпляр frmMain совместно используемым переменным.
Если вы измените свой основной метод сервера на:
<STAThread()> Public Shared Sub Main(formRef As frmMain)
f = FormRef
и затем измените ваш вызов на этот метод:
Call Server.Main(Me)
Тогда это должно решить вашу проблему (при условии, что Server.Main вызывается из frmMain).