Avatar billede Slettet bruger
13. maj 2005 - 10:50 Der er 47 kommentarer og
1 løsning

Remoting virker ikke

Hejsa,

Jeg er i gang med at lave en opgave til skolen, hvor det er påkrævet, at kommunikationen mellem brugergrænsefladen og dataklasserne skal foregå remote.

Jeg har nogenlunde læst mig til hvordan man sætter det op, men det virker ikke helt efter hensigten.

Jeg har to klasser i to forskellige projekter (på to forskellige computere). Den ene er en windows forms applikation:

Denne klasse har en metode, der aktiveres når man trykker på en knap:

private void button1_Click(object sender, System.EventArgs e)
        {
            TcpChannel channel = new TcpChannel();
            ChannelServices.RegisterChannel(channel);

            ActivatedClientTypeEntry acte = new ActivatedClientTypeEntry(typeof(RemoteServer.Testklasse), "tcp://192.168.0.3:5150");
           
            RemotingConfiguration.RegisterActivatedClientType(acte);

            RemoteServer.Testklasse minTestklasse = new RemoteServer.Testklasse();

            label1.Text = minTestklasse.HentNavn();
        }

Klassen har følgende using direktiver ud over dem der indsættes som standard:

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

Det andet projekt er et class library med to klasser.
- En test klasse der returnerer en streng:

using System;

namespace RemoteServer
{
    public class Testklasse : MarshalByRefObject
    {
        public string HentNavn()
        {
            return "Thomas";
        }
    }
}

Og en serverklasse, der opretter en TcpChannel:

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

namespace RemoteServer
{
    public class RemoteServer
    {
        public static void Main()
        {
            TcpChannel channel = new TcpChannel(5150);
            ChannelServices.RegisterChannel(channel);

            ActivatedServiceTypeEntry aste = new ActivatedServiceTypeEntry(typeof(Test2));

            RemotingConfiguration.RegisterActivatedServiceType(aste);
        }
    }
}

Jeg har både forsøgt at afvikle det fra to computere og fra den samme maskine, men jeg får den samme fejl:

Kørsel fra Visual Studio Net
-----------------------------------------------------
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in mscorlib.dll

Adittional information: Der kunne ikke oprettes forbindelse, fordi destinationscomputeren aktivt nægtede det.
-----------------------------------------------------

Desuden kan jeg kun få lov at builde projektet med windows formen, hvis jeg tilføjer .dll'en fra RemoteServer-projektet som en reference - noget, der ikke beskrives i nogle af de bøger jeg har haft adgang til. Hvordan kan det være, at klassenavnet og det remote namespace kun accepteres hvis man tilføjer en assembly-reference? Ryger en del af ideen med remoting så ikke?

Det var et langt indlæg, håber på nogle skarpe svar da det er ved at drive mig til vandvid.

Med venlig hilsen,
Thomas

P.S. Det skal lige siges at der selvfølgelig er netværksadgang mellem maskinerne :-)
Avatar billede spif2001 Nybegynder
13. maj 2005 - 12:06 #1
Har du Firewall? Hvis ja, kan det være den der nægter socketadgangen - eller et virusprogram, der stopper alt indgående trafik og/eller udgående.
Avatar billede bjarner Nybegynder
13. maj 2005 - 12:36 #2
Vedr. ideen med Remoting så skal klientsiden og serversiden jo kende til de objekter mm. som de bruger og har fælles - de kan jo defineres i et fælles modul som refereres af begge. Jeg læser pt. i Advanced .Net Remoting af Ingo Rammer og Mario Szpuszta som jeg indtil videre synes er glimrende.
Avatar billede arne_v Ekspert
13. maj 2005 - 19:41 #3
http://www.eksperten.dk/artikler/86

det sidste eksempel viser hvordan man f.eks. kunne strukturere det
Avatar billede Slettet bruger
13. maj 2005 - 22:25 #4
Jeg fatter stadig ikke en bjælde.
Jeg forsøger at bruge noget fra det eksempel fra den artikel, dog kun måden at sætte selve TcpChannel op på og bruger så min egen Testklasse, der returnerer et navn.

I artiklen er der ingen referencer til det andet namespace i hans klasser, jeg formoder at han benytter flere af hinanden uafhængige namespaces, men hvis jeg selv fjerner en evt. reference til det andet projekt jeg har oprettet med serverklassen får jeg starks fejl: "F:\DotNet_TEST\Remote\RemoteClient.cs(100): The type or namespace name 'Testklasse' could not be found (are you missing a using directive or an assembly reference?)
".

Er det mig der er far-out?
Skal der refereres? Har bare ikke set det i de eksempler fra bøger eller herfra siden...

Nu har jeg oprettet en console application, men det virker heller ikke her.
Avatar billede arne_v Ekspert
13. maj 2005 - 22:31 #5
der er et interface som bliver compilert til X.dll

og både server implementationen og client bliver buildet med reference til den
Avatar billede arne_v Ekspert
13. maj 2005 - 22:31 #6
namespaces burde ikke betyde noget
Avatar billede Slettet bruger
13. maj 2005 - 22:32 #7
Jamen hvorfor får jeg så fejlen at den ikke findes?
Avatar billede arne_v Ekspert
13. maj 2005 - 22:34 #8
du mangler vel reference til den assembly
Avatar billede Slettet bruger
13. maj 2005 - 22:34 #9
Jeg har importeret de nødvendige namespaces, lavet den mest simple klasse jeg overhovedet kunne komme på og stort set brugt det eksempel fra artiklen, men lige lidt hjælper det.

Jeg har forøvrigt slået min windows firewall fra og slået virus scanneren fra, men jeg får stadig fejlen om socketException.
Avatar billede Slettet bruger
13. maj 2005 - 22:35 #10
- "du mangler vel reference til den assembly".

Hvilken assembly ArneV?
Avatar billede Slettet bruger
13. maj 2005 - 22:35 #11
Mener du X.dll?
Hvor kan den findes?
Avatar billede arne_v Ekspert
13. maj 2005 - 22:38 #12
den dll som indeholder Testklasse

I min artikel builder jeg X.cs til X.dll
Avatar billede Slettet bruger
13. maj 2005 - 22:47 #13
Ok. Nu dæmrer det :-)
I mit eksempel fra starten af denne tråd refererer jeg til en dll fra mit class library. Kan det overhovedet lade sig gøre at lave remoting med et class library?

Vil det sige at du også benytter en reference i dine klasser i artiklen? Det fremgår vidst ikke umiddelbart - du bruger i hvert fald ikke en using...

Har jeg forstået det korrekt at:
- Man skal have en applikation kørende - eks console application der lytter til requests?
- At man skal lave .dll'en selv og oprette den som reference i det projekt/ applikations domæne der kalder remote klasserne?
Avatar billede arne_v Ekspert
13. maj 2005 - 22:49 #14
Jeg builder det hele med disse her linier:

csc /optimize+ /t:library /out:X.dll X.cs
csc /optimize+ /t:library /r:X.dll /out:XImpl.dll XImpl.cs
csc /optimize+ /t:exe /out:XServer.exe XServer.cs
csc /optimize+ /t:exe /r:X.dll /out:XClient.exe XClient.cs
Avatar billede arne_v Ekspert
13. maj 2005 - 22:50 #15
/r:X.dll er en reference til X.dll assemblyen

og jeg har da diverse using statements
Avatar billede Slettet bruger
13. maj 2005 - 23:02 #16
Gør du det fra VS command prompten og skal man stå i selve projektmappen ArneV?
Jeg spørger fordi jeg netop har forsøgt med:

csc /r:RemoteServer.dll RemoteServer.cs

Men jeg får en fejl. Jeg stor i roden af projektmappen hvor cs filen ligger.
Avatar billede arne_v Ekspert
13. maj 2005 - 23:04 #17
jeg gør det fra en permanent DOS box som jeg selv har åbnet og set sat PATH op
Avatar billede arne_v Ekspert
13. maj 2005 - 23:07 #18
csc /r:RemoteServer.dll RemoteServer.cs

virker meget mystisk

Skal RemoteServer.exe have en reference til RemoteServer.dll ??
Avatar billede Slettet bruger
13. maj 2005 - 23:08 #19
Det blev jeg ikke meget klogere af :-)
Avatar billede Slettet bruger
13. maj 2005 - 23:10 #20
Det tror jeg ikke at den skal.
RemoteServer skal vel ikke have en reference. Men klientprogrammet skal vel have en reference til RemoteServer.dll for at den kan genkende klasserne der er remote?!?

Ved ikke helt hvad du mener.
Jeg forsøger nu at genskabe mit projekt som det var fra starten, dog med den forskel at jeg laver serveren som en console app. og forsøger at compile .exe-filen til en .dll som jeg så kan referere til.
Avatar billede Slettet bruger
13. maj 2005 - 23:19 #21
error cs0006: metadata file "RemoteServer.dll" could not be found.

Den fejl får jeg efter at have forsøgt at kombilere fra VS command prompt fra den mappe der hedder RemoteServer.

Filen er der jo ikke, den skal vel først laves?
Avatar billede Slettet bruger
13. maj 2005 - 23:23 #22
Min fejl. Fandt ud af at det jo er Testklasse, der skal kombileres ind i RemoteServer.cs.
Men hvor gør jeg det fra? Jeg får en fejl som før når jeg gør det fra roden af projektmappen og samme fejl når jeg gør det fra bin/debug hvor .dll'en ligger.

csc /r:Testklasse.dll RemoteServer.cs
Avatar billede Slettet bruger
14. maj 2005 - 00:12 #23
Hej ArneV.

Nu er jeg da noget så langt som til at finde ud af hvordan man builder klasserne ind i hinanden som du viser i artiklen.
Dog kan jeg ikke builde min RemoteClient, da jeg får at vide at Testklasse ikke kan findes, dette selvom jeg har oprettet en reference til den.

Men de to andre - altså Testklasse og RemoteServer gik fint og der blev genereret to .dll-filer i roden af projektmappen efter at jeg gjorde som du beskrev:

csc /optimize+ /t:library /out:Calc.dll Calc.cs
csc /optimize+ /t:exe /r:Calc.dll /out:Server1.exe Server1.cs
csc /optimize+ /t:exe /r:Calc.dll /out:Client1.exe Client1.cs

Med andre navne på klasserne naturligvis.
Jeg er sgu kørt lidt fast på det her remoting. Kan du hjælpe?
Avatar billede arne_v Ekspert
14. maj 2005 - 00:21 #24
Hvis du refererer den .dll som TestKlasse ligger i og du har den rigtige
using, så bør du også kunne finde den.
Avatar billede Slettet bruger
14. maj 2005 - 00:49 #25
Den skriver den sædvanlige sang om, om man mangler en assembly reference.
- Jeg har kombileret som i artiklen så jeg har en Testklasse.dll liggende i roden af min RemoteServer mappe.
- Denne Testklasse.dll importerer jeg som reference i min RemoteClient og skriver samtidig using Testklasse; i toppen af klassen...

Jeg fatter ikke en meter af det her...
Nå, men sov godt :-)
Avatar billede Slettet bruger
14. maj 2005 - 00:51 #26
Ehmm, forresten havde du tre kombileringer i din artikel efter de færste klasser.
Jeg kunne som skrevet godt kombilere, men kun de to af dem. Den tredje, der refererer til klienten kunne jeg ikke da den jo ikke kan finde klienten i den anden projektmappe.

Hvis man forsøger fra klienten kan den ikke finde Testklasse.dll filen.
Men det har måske noget med min using og reference at gøre, altså hvis den virkede ville man måske sagtens kunne kombilere klienten også???
Avatar billede arne_v Ekspert
14. maj 2005 - 20:28 #27
det sidste eksempel adskiller sig fra de de første eksempler ved at interface
og implementation er adskilt

derfor er der en dll mere og en build mere
Avatar billede Slettet bruger
15. maj 2005 - 13:39 #28
Ok.

Jeg kan som sagt stadig ikke få det til at køre, men det er vidst ikke din skyld. Du har været til stor hjælp i form af dine kommentarer og jeg er da blevet klogere på den måde, at jeg nu ved at de forskellige klasser skal kombileres ind i hinanden (eller noget i den retning).

Du skal klart have dine point, men jeg vil høre dig om du mod ekstra point gidder lave en "working sample" for mig?
Jeg skal bruge dette til en projektopgave til skolen og opgaven lægger op til at der SKAL bruges remoting.
Jeg tænker på noget i retning af en "remote server klasse"/ klasse der åbner en tcp channel. og et par simple remote klasser i samme projekt der returnerer en string.
Og så en klasse i et andet projekt der gør brug af deres metoder.

Det ville være super og der kan du selv sætte antal point du finder rimeligt.
Normalt vil jeg helst selv finde løsningerne, men jeg er sgu en smule presset, så.... :-)

Hvis du lige lægger et svar så får du i hvert fald dine point ArneV.
Avatar billede arne_v Ekspert
15. maj 2005 - 14:03 #29
svar
Avatar billede arne_v Ekspert
15. maj 2005 - 14:04 #30
Kan du skitsere de klasser der skal tilgåes via remoting ? Så kan jeg sikkert
godt lave et eksempel.
Avatar billede Slettet bruger
15. maj 2005 - 15:58 #31
Tak for hjælpen!
Avatar billede Slettet bruger
15. maj 2005 - 16:03 #32
Klasserne der skal tilgås via remoting er klasser/objekter der oprettes via en GUI og som modtager nogle parametre fra GUI, der så bruges som parametre til enten at oprette eller hente data i en database.

Databasen ligger igen i et trdje projekt, hvorfor selve connection-klassen også skal kunne tilgås via remoting fra dataklasserne.

Men du behøver sådan set ikke at lave eksemplet på den måde.
Det jeg savner er en lidt mere tumbesikker forklaring på hvordan man præcis sætter det hele op.
Hvis jeg kunne se hvordan man opsatte de nødvendige referencer til de klasser der skulle kaldes osv.v vil jeg nok være i stand til at lave det selv med mine egne klasser bagefter.

Så min tanke var at der:
- Oprettedes en server-klasser/channel-klasse i det ene projekt
- To eller flere så simple som muligt opbyggede klasser, der kan tilgås remote.

- Et andet projekt der kan tilgå de simple klasser via remoting server-klassen.

Det var jo det jeg selv fiflede med, men altså uden det store held :-)
Avatar billede arne_v Ekspert
15. maj 2005 - 16:09 #33
Jeg kan lave et eksempel som kan buildes med BAT fil. Eller jeg kan lave
et eksempel som kan buildes med NAnt.

Jeg har ikke Visual Studio, så jeg kan ikke lave et eksempel som kan buildes
med den (koden kan selvfølgelig men du vil selv skulle sætte projekterne op - og
jeg tror faktisk at det mere er det som driller dig end selve koden).
Avatar billede Slettet bruger
15. maj 2005 - 16:29 #34
Hvis du i grove træk fortæller hvordan jeg skal bygge det op er det fint. Jeg tror ikke at selve opbygningen volder problemer. Det er en windows application og en console application - sidste er den der skal tilgås remote.
Så skal jeg bare finde ud af derfra hvordan jeg connecter til de remote klasser - altså hvad der skal til sådan at jeg kan se dem.

Tror faktisk mit problem (uden at vide det 100%) er det med at builde klasserne.
Kan man gøre det samme som du gjorde i din artikel via VS?
Altså, skal der så bare oprettes de nødvendige referencer og så buildes for at opnår det samme.

Er ikke den store prompt-konge :-)
Avatar billede Slettet bruger
15. maj 2005 - 16:30 #35
Men kom forresten bare med koden, så kan vi tage den derfra...
Avatar billede arne_v Ekspert
15. maj 2005 - 21:15 #36
Her kommer et eksempel.

Jeg ved faktisk ikke hvor meget bedre det er end det fra artiklen, men ....
Avatar billede arne_v Ekspert
15. maj 2005 - 21:16 #37
Det er lavet som:

client-----(remoting)-----server-----(ADO.NET)-----Access database

client er kun en simpel console test client

tabel T1 har 2 felter:
  F1 INTEGER
  F2 VARCHAR(50)
Avatar billede arne_v Ekspert
15. maj 2005 - 21:17 #38
vi starter med at definere det som skal være kendt både af client og server

Arne.Remoting.Common.cs
-----------------------

using System;
using System.Collections;

namespace Arne.Remoting.Common
{
    [Serializable]
    public class Record
    {
        private int f1;
        private string f2;
        public Record() : this(0, "")
        {
        }
        public Record(int f1, string f2)
        {
            this.f1 = f1;
            this.f2 = f2;
        }
        public int F1
        {
            get
            {
                return f1;
            }
            set
            {
                f1 = value;
            }
        }
        public string F2
        {
            get
            {
                return f2;
            }
            set
            {
                f2 = value;
            }
        }
        public override string ToString()
        {
            return ("(" + f1 + "," + f2 + ")");
        }
    }
    public interface IClientServer
    {
        Record GetOne(int f1);
        ArrayList GetAll();
        void Insert(Record rec);
    }
}
Avatar billede arne_v Ekspert
15. maj 2005 - 21:18 #39
så laver vi en server:

Arne.Remoting.Server.cs
-----------------------

using System;
using System.Collections;
using System.Data.OleDb;
using System.Runtime.Remoting;

using Arne.Remoting.Common;

namespace Arne.Remoting.Server
{
    public class Server : MarshalByRefObject, IClientServer
    {
        private const string CONN_STR = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb";
        public Record GetOne(int f1)
        {
            OleDbConnection con = new OleDbConnection(CONN_STR);
            con.Open();
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM T1 WHERE F1 = " + f1, con);
            OleDbDataReader rdr = cmd.ExecuteReader();
            Record res = new Record();
            if(rdr.Read())
            {
                res.F1 =(int)rdr[0];
                res.F2 =(string)rdr[1];
            }
            rdr.Close();
            con.Close();
            return res;
        }
        public ArrayList GetAll()
        {
            OleDbConnection con = new OleDbConnection(CONN_STR);
            con.Open();
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM T1", con);
            OleDbDataReader rdr = cmd.ExecuteReader();
            ArrayList res = new ArrayList();
            while(rdr.Read())
            {
                res.Add(new Record((int)rdr[0],(string)rdr[1]));
            }
            rdr.Close();
            con.Close();
            return res;
        }
        public void Insert(Record rec)
        {
            OleDbConnection con = new OleDbConnection(CONN_STR);
            con.Open();
            OleDbCommand cmd = new OleDbCommand("INSERT INTO T1 VALUES(" + rec.F1 + ",'" + rec.F2 + "')", con);
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
    public class ServerMain
    {
        public static void Main(string[] args)
        {
            RemotingConfiguration.Configure("Arne.Remoting.Server.exe.config");
            Console.Write("Press enter to exit");
            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
15. maj 2005 - 21:18 #40
serveren skal konfigureres:

Arne.Remoting.Server.exe.config
-------------------------------

<configuration>
  <system.runtime.remoting>
      <application name="ArneServer">
        <service>
            <wellknown mode="Singleton" type="Arne.Remoting.Server.Server, Arne.Remoting.Server" objectUri="ArneServer"/>
        </service>
        <channels>
            <channel port="50000" ref="tcp"/>
        </channels>
      </application>
  </system.runtime.remoting>
</configuration>
Avatar billede arne_v Ekspert
15. maj 2005 - 21:19 #41
så skal vi have en test client

Arne.Remoting.Client.cs
-----------------------

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

using Arne.Remoting.Common;

namespace Arne.Remoting.Client {
    class ClientMain
    {
        public static void Main(string[] args)
        {
            ChannelServices.RegisterChannel(new TcpClientChannel());
            IClientServer ics = (IClientServer)Activator.GetObject(typeof(IClientServer), "tcp://localhost:50000/ArneServer");
            Record r1 = ics.GetOne(2);
            Console.WriteLine(r1);
            ArrayList lst = ics.GetAll();
            for(int i = 0; i < lst.Count; i++)
            {
                Record r = (Record)lst[i];
                Console.WriteLine(r);
            }
            Console.Write("Enter F1: ");
            int f1 = int.Parse(Console.ReadLine());
            Console.Write("Enter F2: ");
            string f2 = Console.ReadLine();
            ics.Insert(new Record(f1, f2));
            ArrayList lst2 = ics.GetAll();
            for(int i = 0; i < lst2.Count; i++)
            {
                Record r = (Record)lst2[i];
                Console.WriteLine(r);
            }
        }
    }
}
Avatar billede arne_v Ekspert
15. maj 2005 - 21:20 #42
og så skal det hele buildes

jeg er doven så jeg har bare smidt det hele i samme dir og builder command line

csc /optimize+ /t:library /out:Arne.Remoting.Common.dll Arne.Remoting.Common.cs
csc /optimize+ /t:exe /r:Arne.Remoting.Common.dll /out:Arne.Remoting.Server.exe Arne.Remoting.Server.cs
csc /optimize+ /t:exe /r:Arne.Remoting.Common.dll /out:Arne.Remoting.Client.exe Arne.Remoting.Client.cs
Avatar billede Slettet bruger
15. maj 2005 - 21:56 #43
Det er stort at du gidder lave et eksempel, men det var måske lidt mere end jeg havde turdet håbe på.
Måske så meget at det bliver en smule uoverskueligt :-)

Jeg er rimeligt inde i arraylists og insætning af poster i en database, men savner som sagt bare en nem guide til remoting - altså:

- Hvordan refererer man de forskellige filer?
- Hvad skal der skrives i server-klassen?
- Hvordan builder man så referencerne mellem app. domains holder op mod hinanden?

Hvordan builder du fek,s. dine egne klasser i dit eksempel herover?
Du snakker om at du er doven. Betyder det at du ligger alle filerne ned i én mappe og builder derfra?

Ja, undskyld at jeg spørger dumt :-)
Avatar billede arne_v Ekspert
15. maj 2005 - 21:58 #44
de 3 kommandoer i 21:20:14 er alt hvad jeg skal bruge for at builde
Avatar billede Slettet bruger
15. maj 2005 - 22:21 #45
Ups, undskyld mit spørgsmål fra før med hvor du ligger filerne. Kan se at du jo netop ligger dem i samme dir.

Men Arne. Er dit eksempel ikke med filer der ligger inden for samme namespace/projekt.
Mit problem (tror jeg) er jo netop at jeg bruger to projekter, men du bruger Arne.Remoting på alle klasserne.

Jeg forstår ikke en bjælde. Hvorfor nedarver din serverklasse fra MarshalByRefObject, IClientServer?
Er det ikke remote klasserne der skal nedarve fra MarshalByRefObject?

Og du bruger pludselig en .config-fil?

Hehe. Det er sgu ikke min remoting-uge i denne uge :-(
Med den fart du har på, kan jeg så ikke få dig til at lave et lille eksempel der tager udgangspunkt i mit eksempel fra det første indlæg?
Samme opbygning i to projekter og evt. med to forskellige klasser der hver returnerer en string...
Avatar billede arne_v Ekspert
16. maj 2005 - 12:01 #46
Hvis du skulle lave mit eksempel i en IDE så vull du nok lave:

- et projekt ClientServer af typen class library
- et projekt Server af type console application eller windows service som
  har en reference til det første projekt
- et projekt client af typen console application eller windows applikacation som
  har en reference til det første projekt
Avatar billede arne_v Ekspert
16. maj 2005 - 12:01 #47
man sparer lidt linier vi server ved at bruge en config fil se artiklen
Avatar billede Slettet bruger
16. maj 2005 - 13:12 #48
Hej Arne. Jeg roder lidt videre med det. Du skal have mange tak for din hjælp!
Jeg har et par bøger om C# og de bøger jeg refererer til i toppen af denne tråd er begge netværksprogrammeringsbøger, hvor jeg må indrømme at jeg finder forklaringerne på opsætning af remoting mangelfuldt.
Jeg faldt så i går lige over en anden bog der har samlet støv på hylden - C# Bible - og her er der faktisk en step by step guide til opsætning af remoting med nogle meget enkle klasser.

Jeg arbejder videre med det via dette eksempel fra bogen, men helt klart også det input fra dig.
Nu kan det da ikke gå helt galt :-)

Point her: http://eksperten.dk/spm/618146
Sig lige til hvis du skal have flere ;-)
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