Avatar billede Slettet bruger
09. marts 2005 - 16:26 Der er 8 kommentarer og
1 løsning

Remoting - udføre metoder på serveren.

Hej eksperter.

Jeg er ved at forsøge mig frem med lidt Remoting. Jeg har 3 klasser.

1: Klient klasse - bliver kompilet til en .exe fil til eksekvering på klienten
2: Server klasse - bliver kompilet til en .exe fil til eksekvering på serveren
3: Remote objekt klasse - bliver kompilet til en .dll og ligger både på klient og server.

Alle filerne ligger i selvstændige projekter i Visual Studio .NET

Jeg er nået så langt, at jeg kan få min klient til at invoke en metode i Remote objekt klassen, og denne vil så blive udført på serveren.

Men mit spørgsmål lyder: Kan jeg ikke komme til at røre ved metoder i min Server klasse? Det er i orden, at jeg ikke kan invoke dem direkte på klienten, men kan jeg ikke få min remote objekt klasse til at invoke en meode i server klassen?

Det irreterer mig at jeg skal ligge alt kode, som jeg vil køre i remote objekt klassen uden at kunne røre ved den kode, der skulle forestille at være min server.

Jeg har i VS.NET forsøgt at oprette en reference fra remote object projektet til server projektet for at kunne bruge server koden, men det vil den ikke acceptere fordi min server ikke er kompilet som et class library.

Er Remoting virkelig tænkt såddan, at alt kode, man skal kunne invoke på serveren, skal være kompilet ned i en .dll for sig selv?
Avatar billede arne_v Ekspert
09. marts 2005 - 16:35 #1
På den måde du har valgt at organisere kode og komponenter: ja.

Fordi koden i din remote objekt klasse skal compiles mod noget.

Men prøv at læs det sidste eksempel i min artikel http://www.eksperten.dk/artikler/86

Ganske vist ligger implementationen i en seperat XImpl.dll men den kunne
godt have ligget i XServer.exe fordi der bruges interface.
Avatar billede Slettet bruger
10. marts 2005 - 08:22 #2
Tak arne_v. Jeg vil lige tage et kig på din artikel og melde tilbage.
Avatar billede Slettet bruger
10. marts 2005 - 10:11 #3
Jeg tror umiddelbart ikke at du kan lave iplementationen i XServer.exe...

Det jeg forsøger at opnå er, som du nok ved, udelukkende at kompile interfacet ned i .dll'en så implementationen kan komme til at ligge i XServer.exe.

Der er to problemer i den forbindelse:

1: Interfacet kan ikke arve fra MarshallByRef objektet, netop fordi det er et interface.

2: Hvordan kan jeg angive, hvilken implementations klasse der skal bruges, når der kaldes metoder i interfacet? Så længe implementationsklassen ligger i DLL'en lader det sig gøre. Men ikke, når den ikke findes ande steder end i Server.exe.
Avatar billede prec Nybegynder
10. marts 2005 - 12:09 #4
Din remote klasse skal vel bare nedarve fra MarshallByRef samt dit interface. Det gør jeg selv og det virker fint.
Avatar billede arne_v Ekspert
10. marts 2005 - 12:15 #5
re 1)

Det behøver den heller ikke

re 2)

På præcis samme måde.

Jeg har lige testet.

slet XImpl.cs

XServer.cs:

using System;
using System.Runtime.Remoting;

using X.Common;

namespace X.Impl {
    // implementation
    // skal extende MarshalByRefObject og interfacet
    public class XRealA : MarshalByRefObject, IX {
        public string WhoAmI()
        {
            return "I am A";
        }
    }
    // implementation
    // skal extende MarshalByRefObject og interfacet
    public class XRealB : MarshalByRefObject, IX {
        public string WhoAmI()
        {
            return "I am B";
        }
    }
}

namespace X.Server {
    // server klasse
    class XServer
    {
        public static void Main(string[] args)
        {
            // konfigurer
            RemotingConfiguration.Configure("XServer.exe.config");
            Console.Write("Press enter to exit");
            Console.ReadLine();
        }
    }
}

XServer.exe.config:

<configuration>
  <system.runtime.remoting>
      <application name="XServer">
        <service>
            <wellknown mode="Singleton" type="X.Impl.XRealA,XServer" objectUri="A"/>
            <wellknown mode="Singleton" type="X.Impl.XRealB,XServer" objectUri="B"/>
        </service>
        <channels>
            <channel port="50000" ref="tcp"/>
        </channels>
      </application>
  </system.runtime.remoting>
</configuration>

Og det virker fint !
Avatar billede Slettet bruger
10. marts 2005 - 12:44 #6
Ja - jeg har siddet siden tidpunktet for mit sidste svar og gransket dit eksempel. Jeg indrømmer at der var en ting eller to jeg tog for givet under min sidste kommentar.

Men jeg er ved at nå et gennembrud nu tror jeg.

Du må hvert fald meget gerne smide et svar arne_v - jeg takker igen for hjælpen!
Avatar billede arne_v Ekspert
10. marts 2005 - 13:13 #7
svar
Avatar billede Slettet bruger
10. marts 2005 - 14:25 #8
Okay....

På serveren registrer jeg en "Well known type" som peger på den klasse du vil have kald fra klienten skal foregå i.

I dll'en compiler jeg et interface ned, som jeg derved kan bruge på klienten, da dll'en findes begge steder.

server klassen implementerer interfacet og dermed er vi klar til at klienten kan kalde kode direkte på serveren.

Tager jeg fejl?

Det virker i hvert fald nu. Det var rigtig dejligt. Så lærte vi også noget nyt i dag :)
Avatar billede arne_v Ekspert
10. marts 2005 - 15:25 #9
du tager ikke fejl
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester