Avatar billede trenskow Nybegynder
18. april 2005 - 22:12 Der er 22 kommentarer og
2 løsninger

Hjælp til .net remoting og server-klient oprettelsen

Hejsa allesammen

Jeg sidder her og roder med vores hovedopgave, og har i den anledning lavet 2 projekter i C#.
Det ene... serverdelen... startes af en GUI, og laver kald ned til server delen af remoting. Denne klasse ser sådan her ud

-------------------------------------------------------------------

using System;
using System.Collections;
using System.Runtime.Remoting.Channels.Tcp;

namespace TC45Server.Klient
{
    public class Klient : MarshalByRefObject
    {
        private KlientController kc;

        public Klient(KlientController kc)
        {
            this.kc = kc;
        }

        #region Metoder der skal kaldes remote
       
        public ArrayList getAllParameters()
        {
            /// denne metode returnerer parametre
            /// på alle køretøjerne, til en klient
            return kc.returnAllParameters();
        }
        public String test(String tilbage)
        {
            Console.Write(tilbage);
            return tilbage;
        }
        public ServerPart.Parameter returnParameter(String nrPlade)
        {
            /// skal returnere parameter for
            /// et specifikt køretøj til remote
            /// klient
            return kc.returnParameter(nrPlade);
        }
        #endregion
    }
}

----------------------------------------------------------------

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;


namespace TC45Server.Klient
{
    public class KlientServer
    {
        public KlientServer()
        {
            // registrere channel
            ChannelServices.RegisterChannel(new TcpServerChannel(2245));
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Klient), "Klient",
                WellKnownObjectMode.Singleton);
            Console.Write("Press enter to exit");
            Console.ReadLine();
        }
    }
}
-----------------------------------------------------------------

Når jeg læser diverse artikler på nettet om dette, så står der, at jeg skal lave en csc kommando på disse filer... når jeg vil lave min Klient.dll kører jeg denne kommando

csc /optimize+ /t:library /out:Klient.dll Klient.cs

og så får jeg en masse fejl...

Klient.cs(18,11): error CS0246: The type or namespace name 'KlientController'
        could not be found (are you missing a using directive or an assembly
        reference?)
Klient.cs(20,17): error CS0246: The type or namespace name 'KlientController'
        could not be found (are you missing a using directive or an assembly
        reference?)
Klient.cs(38,10): error CS0246: The type or namespace name 'ServerPart' could
        not be found (are you missing a using directive or an assembly
        reference?)

Så siger artiklerne også, at jeg nu skal lave en exe fil.. men men men... jeg har jo allerede et "entry point" i mit serverprogram... den starter GUI op.
Hvad skal jeg gøre her....

Så har jeg jo lavet et andet projekt i C# som skal være en klient, og her ser en del af koden sådan her ud...

-----------------------------------------------------------------

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace AdminGUI
{
    public class AdminKlient
    {
        public AdminKlient()
        {
            //
            // TODO: Add constructor logic here
            //
            Klient klt = (Klient)Activator.GetObject(typeof(Klient), "tcp://localhost:2245/Klient");

        }
    }
}

----------------------------------------------------------------
Her siger artiklerne, at jeg skal lave en exe fil her med csc kommandoen.. men igen her, har jeg allerede startet programmet med en GUI... hvad skal jeg gøre her...
for sjovt nok :-) så kender den jo intet til Klient, da det er i 2 forskellige projekter, jeg har lavet det i.

Håber der er nogen som kan hjælpe mig med dette. :-)
Avatar billede arne_v Ekspert
18. april 2005 - 22:18 #1
Din Klient klasse bruger KlientController klassen så du skal vel have en:

/r:dendllhvorklientcontrollerliggeri.dll

på din csc kommando
Avatar billede burningice Nybegynder
18. april 2005 - 22:25 #2
og serveren skal ligeledes have en reference til den assembly Klient-klassen ligger i for at kunne kompile
Avatar billede trenskow Nybegynder
18. april 2005 - 22:29 #3
Arne_v: Takker... men når jeg nu kører denne her

csc /optimize+ /t:library /out:Klient.dll Klient.cs /r:KlientController.cs

så brokker den sig over denne her

fatal error CS0009: Metadata file 'c:\Documents and Settings\Rasmus
        T\Dokumenter\Visual Studio
        Projects\TC45Server\Klient\KlientController.cs' could not be opened --
        'File is corrupt'

Er det bare min computer, som er helt ude i hampen, for når jeg selv åbner den fil, med eks. notepad, så ser den fin ud... og stien er korrekt
Avatar billede arne_v Ekspert
18. april 2005 - 22:31 #4
ikke

/r:KlientController.cs

men

/r:KlientController.dll
Avatar billede burningice Nybegynder
18. april 2005 - 22:36 #5
evt. kan Klient.cs og KlientController.cs med fordel kompiles ind i samme assembly
Avatar billede trenskow Nybegynder
18. april 2005 - 22:41 #6
Arne_v: Vil det sige, at jeg skal til at lave dll filer for alle de klasser som er kaldt inden?
For min KlientController har jo referencer til andre klasser...

cyberfessor: Hvordan? csc /optimize+ /t:library /out:Klient.dll Klient.cs KlientController.cs ?
Avatar billede arne_v Ekspert
18. april 2005 - 22:43 #7
Nej du bør bundle sammen så det der hører sammen buildes til en .dll
Avatar billede arne_v Ekspert
18. april 2005 - 22:44 #8
Groft sagt skal du minimum bruge:

1 .dll med alt det der er fæles for client og server
1 .exe med alt der er specifik for client
1 .exe med alt der er specifik for server

hvor de 2 .exe skal buildes mod den ene .dll

og .dll'en ikke må referere til noget i de 2 .exe
Avatar billede trenskow Nybegynder
18. april 2005 - 22:45 #9
Arne_v: øøhh.. ok.. (godt jeg skal på et 6 ugers C# kursus i Aalborg ;-) )
Hvordan gør jeg det...
Skal jeg gå i roden af projektet, og skrive noget med csc /optimize+ /t:library /out:etellerandet.dll og så alle filerne i projektet?
Avatar billede arne_v Ekspert
18. april 2005 - 22:48 #10
Har du læst min artikel om remoting ? Specielt det sidste eksempel ?
Avatar billede trenskow Nybegynder
18. april 2005 - 22:51 #11
arne_v:
"1 .dll med alt det der er fæles for client og server
1 .exe med alt der er specifik for client
1 .exe med alt der er specifik for server

hvor de 2 .exe skal buildes mod den ene .dll"

Jepper.. så meget har jeg forstået indtil videre.
Jeg skal have en dll af den som hedder Klient, det er her alle metoderne der skal kaldes ligger.
Og så skal jeg compile de 2 eksisterende projekter med den dll fil.

Så er mit problem
Når jeg vil lave en dll fil af Klient, så siger den, at den bla mangler KlientController.
Når jeg vil lave en dll fil af KlientController, så siger den, at den mangler andre referencer. osv osv.

Yes yes.. jeg har læst artiklen.. det er den som jeg har lavet det udfra..
Jeg har bare lavet mine klient og server i 2 seperate projekter inde i Visual Studio.
Avatar billede trenskow Nybegynder
18. april 2005 - 22:52 #12
Jeg nærlæser lige det sidste eksempel en gang til, og ser om det ikke skulle hjælpe denne gang.
Avatar billede arne_v Ekspert
18. april 2005 - 22:54 #13
den ene .dll skal have alt den bruger bygget med
Avatar billede burningice Nybegynder
18. april 2005 - 23:10 #14
trenskow>> hvis du har visual studio, hvorfor roder du så med command line compiling?
Avatar billede burningice Nybegynder
18. april 2005 - 23:12 #15
og ang. projekter i visual studio, så skal du bruge mindst 3 (tre). Som arne har været inde på. 2 programmer (GUI eller Console) og et class library.

VS har så nogle smarte features hvor du under References>Add Reference kan tilføje et andet projekt som reference. Du skal altså her sørge for at hvert af dine 2 Program-projekter har en reference til Class Library'et. Så sørger den selv for at kompilere i rigtig rækkefølge og kopiere de rigtige assemblies ind de rigtige steder.
Avatar billede trenskow Nybegynder
18. april 2005 - 23:15 #16
Cyberfessor: Fordi jeg ikke ved bedre :-)

Jeg er jo kun en datamatiker studerende, som til den sidste eksamen på mandag, så undervisning i selve Visual Studio er det aldrig blevet til... også derfor jeg er glad for at jeg skal på et 6 ugers kursus i det til maj.. håber at lære mere om det der...

Jeg har set, at der er noget der hedder post-build Event command-line. Er det der, jeg skal smide de her linier ind.. eller er det noget helt andet du hentyder til?
Avatar billede trenskow Nybegynder
18. april 2005 - 23:17 #17
cyberfessor:

Det vil sige.. at jeg kan lave den "rå" kode af alle klasse filerne i et projekt.
Lave GUI i deres egne projekter
Og lave remoting i sit 3. projekt, og så lave referencer til de projekter som man har behov for....?
Avatar billede trenskow Nybegynder
18. april 2005 - 23:26 #18
Ok.. har kigget lidt mere på det...
og er jeg på den rigtige vej her....
Den kode, som henholdsvis kun skal bruges af server og klient programmet, skal laves som et Windows Control Library projekt.
Remoting i Class Library
og så self GUI i Windows Application.
Er det sådan jeg skal gøre?
Avatar billede arne_v Ekspert
18. april 2005 - 23:34 #19
Nu mener jeg ikke at det bør gøre den store forskel om man builder i Visual Studio
eller command line eller med NAnt eller ...

Den grundliggende problemstilling er den samme: at få det splittet op i 3 klumper
med de angivne afhængigheder og specielt ikke afhængigheder.
Avatar billede burningice Nybegynder
18. april 2005 - 23:38 #20
arne>> selvfølgelig... og det er da nok også bedst at få det lært på den hårde måde før man går over til drag'n drop-programmering, for så for man det aldrig lært.
Avatar billede burningice Nybegynder
18. april 2005 - 23:40 #21
trenskow>> normalt vil man egentlig kun lægge interfaces ned i sit classlibrary, da man på den måde kan kompile den en gang for alle og ikke tænke på den mere. Så vil man på serveren lave en klasse der nedarver fra dette interface og heri have al den "rå" kode. Så slipper klienten også for at have en dll-fil fyldt med en masse kode den aldrig får brug for alligevel.
Avatar billede trenskow Nybegynder
18. april 2005 - 23:54 #22
ok.. takker begge 2.
Hvis i vil svare, så vil jeg dele rundhåndet ud, af de tilgængelige point
Avatar billede arne_v Ekspert
18. april 2005 - 23:57 #23
foruden at man kan skifte implementationen uden at skifte interfacet

+svar
Avatar billede burningice Nybegynder
19. april 2005 - 07:40 #24
.
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