[C#.NET] - Reference

Pagina: 1
Acties:

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
Hoi,

ik ben net begonnen met C#.NET. Ik heb er al het een en ander over gelezen en ben nu begonnen met een simpel chat voorbeeld dat ik zelf wil gaan uitbreiden. Het gaat vooral om de bekendheid met remoting die ik wil krijgen.

Ik heb een solution 'chat_gds'. In die solution heb ik 2 projecten zitten. ChatClient en ChatServer. Chatclient is een Form en chatserver een console application.

Deze code staat in de aanroep van de server:
C#:
1
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ChatServer), "ChatServer", WellKnownObjectMode.Singleton);


Deze code in de client:
C#:
1
RemotingConfiguration.RegisterWellKnownClientType(typeof(ChatServer), "http://localhost:12345/ChatServer");
Ik heb boven elke class 'namespace chat_gds' staan.

Ik heb de reference 'System.Runtime.Remoting' toegevoegd. Na het builden krijg ik echter de volgende foutmelding:
C#:
1
The type or namespace name 'ChatServer' could not be found (are you missing a using directive or an assembly reference?)


Deze fout geeft hij op deze regel in ChatClient:
C#:
1
private ChatServer server;


Dit zijn mijn 'includes':
C#:
1
2
3
4
5
6
7
8
9
10
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Threading;


Terug naar het probleem. Ik heb dus het idee dat in de chatclient nog een referentie naar de chatserver moet opnemen, hoe doe ik dit? Ik heb al met de aangegeven foutmelding gezocht op google en op got, maar het lukt me niet een oplossing te vinden.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13-05 21:26

gorgi_19

Kruimeltjes zijn weer op :9

Hij kan de class ChatServer niet vinden? :) Deze zal waarschijnlijk in een 3rd party dll staan :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 12-05 11:45
je moet wel chat_gds.ChatServer aanmaken. Ook al zit je in dezelfde namespace dan maakt dat nog niks uit. Als je geen namespace zou gebruiken dan heb je er geen last van. Je kan ook using chad_gds; bovenaan zetten.

succes ermee

Klaas


  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
klaasopurk schreef op maandag 28 februari 2005 @ 20:20:
je moet wel chat_gds.ChatServer aanmaken
Hoe bedoel je dat? Waar moet ik dat aanmaken?
klaasopurk schreef op maandag 28 februari 2005 @ 20:20:Je kan ook using chad_gds; bovenaan zetten.
Dat heb ik net gedaan, maar geeft hetzelfde resultaat. Kan het komen doordat het form (chatclient) en de console application (chatserver) niet in hetzelfde project zitten? Ze zitten wel in dezelfde solution. Of zit ik nu vaag te denken/praten?

Die Class ChatServer is geen 3d party.
C#:
1
public class ChatServer : MarshalByRefObject

Zo staat ie gedeclareerd in chatserver.cs

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 12-05 11:45
dat ze in dezelfde solution is niet verplicht maar wel beter.

je moet bij project chatClient op rechtermuis klikken--> add reference --> tablad project in het dialoog aanklikken --> je project chatserver dubbelklikken --> ok drukken

en het werk dan!

Klaas


  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
klaasopurk schreef op maandag 28 februari 2005 @ 20:32:
je moet bij project chatClient op rechtermuis klikken--> add reference --> tablad project in het dialoog aanklikken --> je project chatserver dubbelklikken --> ok drukken
Dan krijg ik een foutmelding 'A reference to ChatServer could not be added. An assembly must have a dll extension in order to be referenced'. Hmm, ik ga eens even op dit foutmelding zoeken.

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 12-05 11:45
Heb je in Chatserver al ene reference naar chatclient. Want dan kan het niet. je kan niet wederzijds linken.

oplossing is in 1 project stoppen.

Klaas


  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
klaasopurk schreef op maandag 28 februari 2005 @ 20:37:
Heb je in Chatserver al ene reference naar chatclient. Want dan kan het niet. je kan niet wederzijds linken.
Ik heb in chatserver geen referentie naar chatclient.

Kan het zijn dat ik mijn project 'ChatServer' niet van het type 'Console Application' moet maken, maar van het type 'Class Library' zodat er een dll gemaakt wordt?

  • klaasopurk
  • Registratie: Februari 2004
  • Laatst online: 12-05 11:45
het project chatserver moet reference worden dus een dll. en geen console idd, want dat is uitvoer proejct.

Klaas


  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
klaasopurk schreef op maandag 28 februari 2005 @ 20:45:
het project chatserver moet reference worden dus een dll. en geen console idd, want dat is uitvoer proejct.
Dat heb ik nu gedaan. Nu krijg ik inderdaad geen foutmeldingen meer. Alleen het programma werkt nog niet, maar goed, dat is een ander probleem. Bedankt voor het oplossen van dit probleem.

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 12:57
Hmm volgens mij heeft het toch met hetzelfde te maken, ik krijg nu deze foutmelding:
C#:
1
System.IO.FileNotFoundException: File or assembly name ChatServer, or one of its dependencies, was not found.

Nu kom ik er net achter dat er dus geen executable van chatserver meer aangemaakt wordt (het is nu immers ook een class library). Maar ik heb die eigenlijk wel nodig. Het zit dus als volgt. Via een console wil ik een server starten. Daarna start ik chatclient op die dus een gui geeft waarmee gechat kan worden. Alles wat ingetypt wordt en verzonden wordt (na indrukken van een button) wordt naar de server gestuurd. Alle clients pollen continue de server om alles wat er gechat is op te halen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
Tja, ik heb wel een vermoeden, maar zonder wat relevante voorbeeld code wordt het toch moeilijk.

Zeg ook eens duidelijk nu hoe de situatie is mbt je assemblies.

Ik zelf zou een DLL maken die de server zelf bevat; dan kan je een exe of Windows Service schrijven die deze DLL (waarin je remoted object zit; je chat-server dus), host.

Dan maak je een client, die een connectie maakt met die server. Hoedanook zal je client wel eea moeten afweten van je server-object (de client zal de interface van de server moeten kennen).

Ik zou het dus uiteindelijk zo doen:
- één assembly maken (DLL), waar de interfaces van de remoted classes in gedefinieerd zijn. Deze assembly wordt dan zowel op de server als op de client gedeployed.
- één assembly met daarin het uiteindelijke 'remote-object' (marshalbyrefobj). Deze assembly komt enkel op de server
- een applicatie die het remote object host (op de server)
- een client applicatie.

Bv:
interface:
code:
1
2
3
4
5
6
7
8
public delegate void ReceiveData( object sender,  MyChatEventArgs e );

interface IMyChatServer
{
     event ReceiveData         DataReceived;

      void SendText (string userName, string message);
}


Server:
code:
1
2
3
4
public class MyChatServer : MarshalByRefObj, IMyChatServer
{
       // Implementeer hier de interface...
}


Client:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private IMyChatServer _server;

private void ConnectButton_Click(object sender, EventArgs e )
{
   _server = (IMyChatServer)Activator.GetObject (....);
   _server.DataReceived += new ReceiveData (this.MessageSubmitted);
   _server.SendText (nickName, "joined the session");
}

private void SendButton_Click( object sender, EventArgs e )
{
   _server.SendText (nickName, txtMessage.Text);
}

private void MessageSubmitted( object sender, MyChatEventArgs e )
{
     // blabla
     // toon hier wat er gezegd werd:
     linesListBox.Lines.Add (e.Username, e.MessageSaid);
}


Niets getest ofzo, gewoon ff een snelle opzet.
Je merkt ook wel dat hier nog een class ontbreekt, en dat is de MyChatEventArgs class; hier moet je wel ff opletten dat je deze 'serializable' maakt.

https://fgheysels.github.io/

Pagina: 1