Avatar billede brian0905 Nybegynder
21. juni 2003 - 17:26 Der er 16 kommentarer og
1 løsning

Serialization eller remoting fejl ?

Jeg er ved at lege med at sende objekter over netværket, og så vidt jeg har læst mig skal der bruges serialization. Jeg har en server og en klient, de fungerer fint så længe det er strings og ArrayList (i hvertfald hvis jeg manuelt smider noget i arraylisten), ingen problemer med at returnere noget af det. Problemet opstår på klienten når den kalder en metode på serveren der skal returnere en ArrayList. Serveren skal kontakte andre klasser der skal generere denne ArrayList ud fra et XML dokument, min server metode skal så bare returnere den til klienten. Når jeg forsøger at gøre dette laver den fejl og siger at den ikke kan finde assemblien CollaborationServer (det er mit namespace på serveren??) Hvorfor vil den ikke det? problemet er helt klart isoleret til sidste linie i funktionen på server.cs (markeret med ***)

Server.cs:
using System;
using System.Windows.Forms;
using System.Collections;
using GeneralInterface;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels ;
using System.Runtime.Remoting.Channels.Tcp;

namespace CollaborationServer
{
    /// <summary>
    /// Summary description for Server.
    /// </summary>
    public class Server : MarshalByRefObject, GeneralInformation
    {
        ListBox liste= new ListBox();
        public Server(ListBox minListe)
        {
            liste=minListe;
            liste.Items.Add(DateTime.Now.ToString()+"\tInvoking server...");
        }

        public Server()
        {
           
        }

        public ArrayList getAvailableModules()
        {
            liste.Items.Add(DateTime.Now.ToString()+"\tQuerying modules");
            XMLAdministrator xmladmin=new XMLAdministrator();
            //ArrayList myliste=xmladmin.ProcessXML();
            ArrayList myliste=new ArrayList();
            myliste=xmladmin.ProcessXML();
            liste.Items.Add(DateTime.Now.ToString()+"\tModules ready for beam");
            return myliste; //**********HER ER FEJL
        }

        public string getServerVersion()
        {
            RegistrationReader rr=new RegistrationReader();
            return rr.readMajorVersionNumber()+"-"+rr.readMinorVersionNumber();
        }

        public bool startServer()
        {
            try
            {
                TcpServerChannel tsc = new TcpServerChannel(8228);
                ChannelServices.RegisterChannel(tsc);
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server)
                    , "Server" , WellKnownObjectMode.Singleton);
                return true;
            }
            catch(Exception e)
            {
                liste.Items.Add(DateTime.Now.ToString()+"\tFailure: "+e);
                return false;
            }
           
        }

    }
}

XMLAdministrator.cs:

using System;
using System.Xml;
using System.Collections;

namespace CollaborationServer
{
    /// <summary>
    /// Summary description for ConfigReader.
    /// </summary>
    public class XMLAdministrator
    {
        public XMLAdministrator()
        {
            //
            // TODO: Add constructor logic here
            //
        }
       
        public ArrayList ProcessXML()
        {
            ArrayList minListe=new ArrayList();
            XmlDocument doc = new XmlDocument( );
            doc.Load("Modules.xml");
            XmlNodeList fnames = doc.GetElementsByTagName("Name");
            XmlNodeList lnames = doc.GetElementsByTagName("Description");
            XmlNodeList enabled = doc.GetElementsByTagName("Enabled");
            XmlNodeList code = doc.GetElementsByTagName("Code");
            for ( int i = 0; i < fnames.Count; ++i )
            {
                ModuleDescription md=new ModuleDescription(fnames[i].InnerText, lnames[i].InnerText, enabled[i].InnerText, code[i].InnerText);
                minListe.Add(md);
            }
            return minListe;
        }
    }
}

min klient:
...
private void button1_Click_1(object sender, System.EventArgs e)
        {
            ChannelServices.RegisterChannel( new TcpClientChannel());
            generalint = (GeneralInformation)Activator.GetObject(typeof(GeneralInformation)
                , "tcp://localhost:8228/Server");
            if ( generalint == null )
            {
                textBox1.AppendText("TCP SERVER OFFLINE ...PLEASE TRY LATER");
                return ;
            }
            textBox1.Text=generalint.getServerVersion();
            ArrayList moduler=generalint.getAvailableModules();
            if(moduler==null)
            {
                textBox1.AppendText("\r\nModuler er null");
            }
            else
            {
                textBox1.AppendText("\r\nModuler er ikke null");
            }
        }
...

Objekterne i arraylisten er af typen ModuleDescription:

using System;

namespace CollaborationTool
{
    /// <summary>
    /// Summary description for ModuleDescription.
    /// </summary>
    [Serializable]
    public class ModuleDescription
    {
        private string ModName;
        private string ModDesc;
        private string ModEnabled;
        private string ModCode;

        public ModuleDescription()
        {
           
        }

        public ModuleDescription(string newName, string newDescription, string newEnabled, string newCode)
        {
            ModName=newName;
            ModDesc=newDescription;
            ModEnabled=newEnabled;
            ModCode=newCode;
        }

        public string ModuleName
        {
            get { return ModName; }
            set { ModName=value; }
        }

        public string ModuleDesc
        {
            get { return ModDesc; }
            set { ModDesc=value; }
        }

        public string ModuleEnabled
        {
            get {return ModEnabled;}
            set {ModEnabled=value;}
        }

        public string ModuleCode
        {
            get { return ModCode;}
            set { ModCode=value;}
        }
    }
}


Håber der er nogle der kan hjælpe mig med det her
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 18:51 #1
Hvorfor er det ModuleDescription ligger i et andet namespace? Har du så husket: using CollaborationTool i både server og klient? Hvad er det den præcise fejl er?
Avatar billede brian0905 Nybegynder
21. juni 2003 - 19:02 #2
Den præcise fejl er: System.IO.FileNotFoundException: File or assembly name CollaborationServer, or one of its dependencies, was not found.
File name: "CollaborationServer"

Server stack trace:
  at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Boolean isStringized, Evidence assemblySecurity, Boolean throwOnFileNotFound, Assembly locationHint, StackCrawlMark& stackMark)
...
at GeneralInterface.GeneralInformation.getAvailableModules()

Det hele er lavet i tre forskellige projekter. CollaborationServer i et selvstændigt projekt. Interfacet i et selvstændigt projekt og endelig CollaborationTool i et separat projekt. Der findes både på serveren og på klienten en klasse "ModuleDescription" i det ene projekt hører den i CollaborationTool namespacet mens i det andet projekt hører den til CollaborationServer namespacet. Det vil sige at namespacet matcher med resten af de filer den hører i projekt med... Det vil vel ikke give mening at bruge using CollaborationTool i server applikationen da CollaborationTool er namespacet for min klient, eller hva og kender serveren overhovedet til det namespace?
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:04 #3
Det er vist bare mig, der stadig er lidt træt... Men det lyder lidt mystisk... Jeg må vist lige prøve at "genskabe" dit projekt... arbejder på sagen :-)
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:07 #4
Gider du egentlig ikke sende noget kode til mig? Jeg gider ikke alt det copy/paste (ja, jeg ER doven)... Hvis du gider, kan du sende til niels_beck@hotmail.com
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:29 #5
Hmm... har udpakket de tre filer til

./CollaborationServer
./CollaborationTool
./GeneralInterface

Men når jeg åbner ./CollaborationServer/CollaborationServer.sln får jeg et par fejl, og der er ikke nogen filer tilføjet under CollaborationServer-projektet...
Gider du ikke sende det igen - og så pakke det hele ned så biblioteksstrukturen er med... Altså pakke ./ i stedet for ./CollaborationServer, ./CollaborationTool og ./GeneralInterface i hver deres .zip...

Ved godt jeg begynder at blive besværlig nu...
Avatar billede brian0905 Nybegynder
21. juni 2003 - 19:36 #6
det kom der
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:37 #7
Så virkede det lidt bedre :-) Kigger lige på det...
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:43 #8
Den siger bare:

Error: License not loaded
Avatar billede brian0905 Nybegynder
21. juni 2003 - 19:47 #9
ups....He he.....der kommer lige en .reg fil (man laver vel licens til sit system) sorry...
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 19:48 #10
Helt okay... og ja, det er jo licenssystemet der er sjovest/vigtigst at lave :-)
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 20:06 #11
Problemet ser ud til at være, at klienten (CollaborationTool) ikke kender til ModuleDescription. Hvis du f.eks. flytter ModuleDescription.cs til GeneralInterface-projektet (og de to andre begge indeholder en reference til GeneralInterface-projektet), har du ingen problemer. Generelt vil jeg også sige, at det vil være smartest at holde typer som benyttes på både server/klient i et generelt projekt som så refereres til i både server/klient-projekter...
Avatar billede brian0905 Nybegynder
21. juni 2003 - 20:08 #12
ok, skal der laves nogle referencer i mit GeneralInterface når jeg flytter min ModuleKlasse derover eller er det nok at de er i samme namespace?
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 20:11 #13
Namespacet i ModuleDescription skal ændres til GeneralInterface. I XMLAdministrator skal der så lige være en reference til GeneralInterface. Derefter skulle det gerne virke...
Avatar billede brian0905 Nybegynder
21. juni 2003 - 20:14 #14
jeg tester.... men vil man så vælge at fjerne moduledescription fra både server og klient og kun lade klassen være kendt gennem interfacet?
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 20:15 #15
Helt klart... det skal nødigt være sådan, at den samme kode står flere steder...
Avatar billede brian0905 Nybegynder
21. juni 2003 - 20:32 #16
Tja.... hva kan man sige....det virker :-)
Super, tak for hjælpen
Avatar billede nielslbeck Nybegynder
21. juni 2003 - 20:33 #17
:-)
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