Toon posts:

[.Net] Remoting - Interfaces, error bij gebruik objecten.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een Remoting Server draaien, met daarop een service, die een Huis-object aanmaakt. Deze service wordt door de client via een interface gebruikt. Dit werkt alemaal prima zolang de service 1 huis-object teruggeeft. Als ik een functie maak waarin een array van huis-objecten wordt teruggegeven dan krijg ik een melding:
"An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll

Additional information: File or assembly name DistObjects, or one of its dependencies, was not found."


Heeft iemand al gewerkt met Remoting en Interfaces, en dan met name met het teurggeven van arrays van objecten?

De code in de Client is als volgt:
Dit werkt wel, hier wordt 1 enkel object verkregen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub btnGet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGet.Click

   Private objHS As IHomeService

   ChannelServices.RegisterChannel(New TcpClientChannel())

   objHS = Activator.GetObject(GetType(IHomeService), "tcp://localhost:8085/HomeService")

   Dim Huis As IHuis
   Huis = objHS.GetEenObject("123 Somestreet")
   txtAddress.Text = Huis.Address
End Sub



Dit werkt niet, hier wordt een array van objecten verkregen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Private objHS As IHomeService

   ChannelServices.RegisterChannel(New TcpClientChannel())

   objHS = Activator.GetObject(GetType(IHomeService), "tcp://localhost:8085/HomeService")

   Dim Huisje() As IHuis

   Huisje = objHS.GetArray("123 Somestreet")
End Sub


Het gaat dus fout op de laatste regel: Huisje = objHS.GetArray("123 Somestreet")


Interface
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Interface IHomeService

   Function GetArray(ByVal Address As String) As IHuis()

   Function GetEenObject(ByVal Address As String) As IHuis

End Interface



Public Interface IHuis
   ReadOnly Property Address() As String
End Interface



DistObjects, wordt ook zonder errors allemaal uitgevoerd.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class HomeService
   Inherits MarshalByRefObject
   Implements IHomeService


   Public Function GetArray(ByVal Address As String) As IHuis() Implements IHomeService.GetArray
      Try
         Dim homes1 As New Huis("1")
         Dim homes2 As New Huis("4")

         Dim huizen(1) As Huis

         huizen(0) = homes1
         huizen(1) = homes2
         Return huizen
      Catch
         Throw New Exception("2")
      End Try
   End Function


   Public Function GetEenObject(ByVal Address As String) As IHuis Implements IHomeService.GetEenObject
      Dim homes As New Huis("1")
      Return homes
   End Function

End Class



<Serializable()> _
Public Class Huis
   Inherits MarshalByRefObject
   Implements IHuis

   Private mstrAddress As String

   Friend Sub New(ByVal Address As String)
      mstrAddress = Address
   End Sub

   Public ReadOnly Property Address() As String Implements IHuis.Address
      Get
         Return mstrAddress
      End Get
   End Property
End Class



En natuurlijk de server waar alles op draait
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels

Module Module1
   Sub Main()
      Dim mTcp As Tcp.TcpChannel

      mTcp = New Tcp.TcpChannel(8085)
      ChannelServices.RegisterChannel(mTcp)

      RemotingConfiguration.RegisterWellKnownServiceType( _
        GetType(HomeService), "HomeService", _
        WellKnownObjectMode.SingleCall)

      Console.WriteLine("Druk op enter om server af te sluiten.")
      Console.ReadLine()
   End Sub
End Module

Verwijderd

Lijkt mij dat je client een assembly zoekt met daarin de klassedefinitie van het teruggegeven object. Deze staat volgens het programma in DistObjects. Heb je deze assembly wel bij je client in de directory van de executable staan?

Verwijderd

Topicstarter
Dat hoeft juist niet omdat ik een Interface gebruik. Als je wil kan ik wel een korte uitleg geven van hoe dat werkt.

Ik ben ondertussen al tegen de oorzaak aangelopen; Arrays zijn niet 'serializable', waardoor ze niet verstuurt kunnen worden via remoting. Voor het gebruiken van verzamelingen via remoting kan bijvoorbeeld een Hashtable gebruikt worden. Dit heb ik al voor elkaar ondertussen, alleen treden hier weer nieuwe vraagstukken bij op, zoals hoe kan je hashtables sorteren en binden aan een datagrid o.i.d. To be continued....

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik heb ook gedoe gehad met interfaces en .NET Remoting. Vanuit andere systemen (RMI, Corba) had ik ook de ervaring dat je netjes met interfaces moet werken, die je implementeert op de server-side en gebruikt om stubs te genereren voor de client-side.

In .NET Remoting adviseren ze echter nergens om deze scheiding aan te leggen. Kennelijk hebben ze gedacht dat dat 'makkelijker' is. Zelf vind ik het absoluut niet makkelijker of fraaier. Toen ik zelf wel een scheiding probeerde aan te leggen, kreeg ik precies dezelfde problemen: de implementatie moet beschikbaar zijn op de client. Ik had toen geen zin om uit te zoeken of dit nog op een of andere manier opgelost kan worden, dus helaas kan ik je verder geen advies geven :o .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • EfBe
  • Registratie: Januari 2000
  • Niet online
In MS' voorbeelden omtrent remoting wordt wel degelijk gesproken over een aparte, specifieke assembly waarin louter de interfaces worden gedefinieerd die zowel op de client ALS op de server worden gebruikt. Deze assembly gebruik je dan voor zowel de client als de server.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zijn dat ook echt interfaces? (Ik moet zeggen dat het pre-1.0 was)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • EfBe
  • Registratie: Januari 2000
  • Niet online
mbravenboer schreef op 03 april 2003 @ 10:08:
Zijn dat ook echt interfaces? (Ik moet zeggen dat het pre-1.0 was)
Ja, gewoon alleen een namespace met interface definities. Die compileer je naar een DLL en die reference je in je client en server.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1