none
Обращение к своей службе Windows RRS feed

  • Общие обсуждения

  • Доброго времени суток!

    Не могу справиться с такой задачей:
    есть собственная служба, которая читает текстовый файл и запоминает его содержимое; и есть WinForm приложение, которое обращается к службе и получает эти данные.

    Вот моя служба:

    Public Class Service_TestClass
    
        Inherits ServiceProcess.ServiceBase
    
        Private serviceMessageRemotable As ServiceMessageRemotable
    
        Private p_textvalue As Integer
        Public Property textvalue As Integer
            Get
                Return p_textvalue
            End Get
            Set(value As Integer)
                p_textvalue = value
            End Set
        End Property
    
        Protected Overrides Sub OnStart(ByVal args() As String)
    
            Try
                Runtime.Remoting.Channels.ChannelServices.RegisterChannel(New Runtime.Remoting.Channels.Tcp.TcpChannel(8001), False)
    
                Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(GetType(ServiceMessageRemotable), _
                                                                                    "Service_Test", Runtime.Remoting.WellKnownObjectMode.Singleton)
    
                Runtime.Remoting.RemotingServices.Marshal(serviceMessageRemotable, "Service_Test")
    
            Catch ex As System.Exception
    
            End Try
    
            If IO.File.Exists("C:\Temp\file.txt") = True Then
    
                serviceMessageRemotable = New ServiceMessageRemotable(textvalue.ToString)
    
            End If
    
        End Sub
    
        Public Sub New()
    
            serviceMessageRemotable = New ServiceMessageRemotable(textvalue.ToString)
            serviceMessageRemotable.Message = textvalue.ToString
            InitializeComponent()
    
        End Sub
    
        Protected Overrides Sub OnStop()
    
        End Sub
    
    End Class
    
    <Serializable()> Public Class ServiceMessage
    
        Private strMessage As [String]
    
        Public Sub New()
        End Sub
    
        Public Sub New(str As String)
            strMessage = str
        End Sub
    
        Public Property Message() As String
            Get
                Return strMessage
            End Get
            Set(value As String)
                strMessage = value
            End Set
        End Property
    
    End Class
    
    Public Class ServiceMessageRemotable
    
        Inherits MarshalByRefObject
    
        Public serviceMessage As New ServiceMessage()
    
        Public Sub New(strMessage As String)
            serviceMessage.Message = strMessage
        End Sub
    
        Public Overrides Function InitializeLifetimeService() As [Object]
            Return Nothing
        End Function
    
        Public WriteOnly Property Message() As String
            Set(value As String)
                serviceMessage.Message = value
            End Set
        End Property
    
    End Class

    Я по-всякому проверял - служба исправно запускается, читает фал и присваивает нужным свойствам нужные значения, т.е. служба работает, как ей и положено.

    А вот приложение:

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            Try
    
                remotableMessage = Activator.GetObject(GetType(WindowsService2.ServiceMessageRemotable), _
                                                   "tcp://localhost:8001/Service_Test")
    
                MessageBox.Show(remotableMessage.serviceMessage.Message)
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString())
                Exit Sub
            End Try
    
        End Sub

    При выполнении, всегда получаю ноль. При пошаговой отладке, при обращении к заветному свойству Message, получаю:

    ?remotableMessage.serviceMessage.Message
    {"Не удалось найти метод для данного экземпляра объекта."}

    14 февраля 2013 г. 5:06

Все ответы

  • Привет

    Проверьте еще с помощью команды netstat -a в консоле, что ваша служба действительно слушает 8001-ый порт.

    Также у вас WindowsService2.ServiceMessageRemotable - это общий класс для службы и клиента, описанный в общей для них dll?


    Для связи [mail]

    15 февраля 2013 г. 7:37
  • Прошу прощения за длительное молчание.

    Нет - класс ServiceMessageRemotable определен в проекте сервиса. Сборка WindowsService2 подключена к приложению, как ссылка.

    Да - служба слушает порт 8001.

    24 февраля 2013 г. 18:52
  • Кто-нибудь сможет подсказать?
    7 апреля 2013 г. 16:58