/// <summary>
 /// speichert die Serverkonfiguration im ConfigFile
 /// </summary>
 /// <param name="pin_Serverkonfiguration"></param>
 /// <returns></returns>
 public bool SpeichereServerkonfiguration(Cdv_Serverkonfiguration pin_Serverkonfiguration)
 {
     XMLZugriff XMLZugriffsObject = new XMLZugriff();
     XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad);
     XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/Address");
     XMLZugriffsObject.SetzeKnotenAttribut(0, "IP",
         pin_Serverkonfiguration.IP);
     return true;
 }
        /// <summary>
        /// startet die Serverroutine, d.h.
        /// alle PortalLogiken werden aktiviert und via Remoting publiziert
        /// </summary>
        /// <returns></returns>
        public void StarteServerRoutine()
        {
            this.InitSplashScreen();
            this.SetzeSplashScreenStatus("StarteServerRoutine Beginn");

            #region Initialisiere Kanal
            this.SetzeSplashScreenStatus(" Initialisiere Kanal");

            // lade den Port aus der Serverkonfiguration
            _LetztePortNummer = Convert.ToInt16(Serverkonfiguration.Port);
            // bestimme einen freien Port
            while ((!_KanalOffen) && (!Tools.Server.CMethoden.IstPortFrei(_LetztePortNummer)))
            {
                _LetztePortNummer++;
            }
            if (!_KanalOffen)
            {
                // öffne Kanal auf dem alle Remotable Objects dieses Servers angesprochen werden können
                this._ServerKanal = Tools.Server.CMethoden.InitialisiereKanal(_LetztePortNummer);
                _Interner_RemotePort = _LetztePortNummer;
                _KanalOffen = true;
            }
            this.SetzeSplashScreenStatus("Setze Serverkonfiguration");
            // speichere den verwendeten Port in der Serverkonfiguration
            pELS.Tools.XMLZugriff myXMLZugriff = new pELS.Tools.XMLZugriff();
            myXMLZugriff.LadeDatei(pELS.Tools.Server.CKonstanten._str_ServerConfigPfad);
            myXMLZugriff.WaehleKnoten("pELS/pELS-Server/Address");
            myXMLZugriff.SetzeKnotenAttribut(0,"Port", _Interner_RemotePort.ToString());

            //Wenn die gewünschte Portnummer nicht vergeben werden konnte, dann Hinweis auf verwendeten Port ausgeben
            if(_LetztePortNummer.ToString() != Serverkonfiguration.Port)
                System.Windows.Forms.MessageBox.Show("Der Port "+Serverkonfiguration.Port+"konnte nicht für den pELS-Server reserviert werden.\n Gewählter Anmeldeport: "+_LetztePortNummer.ToString());
            #endregion

            this.SetzeSplashScreenStatus("Initialisiere DB");
            InitialisiereCdv_DB();
            this.SetzeSplashScreenStatus("Initialisiere ObjektManager");
            InitialisiereObjektManager(_LetztePortNummer);

            // URL des Servers
            string ServerURL = "tcp://" + Serverkonfiguration.IP;
            // bezeichnet den Klassen- u. Dateinamen der PortalDecorators
            string PortalDecoratorName = "";

            // lese alle Dateien aus dem Verzeichnis, in welchem sich die
            // Dlls der PortalLogiken befinden
            System.IO.DirectoryInfo dir_sbeVerzeichnis =
                new System.IO.DirectoryInfo(CKonstanten._str_PortalLogikPfad);
            // lese alle Dlls ein
            System.IO.FileInfo[] arl_alleAssemblies = dir_sbeVerzeichnis.GetFiles("*.dll");
            // gehe durch alle Assemblies
            this.SetzeSplashScreenStatus("Lade Assemblies:");
            foreach(System.IO.FileInfo fileInfo in arl_alleAssemblies)
            {
                // lese alle in der Dll enhaltenen Typen ein
                Assembly _asm_Tmp = Assembly.LoadFrom(fileInfo.FullName);
                Type[] _AvailableTypes = _asm_Tmp.GetTypes();
                foreach(Type _AktuellerType in _AvailableTypes)
                {
                    this.SetzeSplashScreenStatus("Lade Assemblies:" + " " + _AktuellerType.ToString(),false);
                    // überpüfen, ob aktueller Typ das benötigte Interface implementiert
                    if (null != (_AktuellerType.GetInterface(
                        // und nicht abstrakt ist (wg. Cap_portalLogik)
                        (typeof(pELS.Server.IPortalLogik).FullName))))
                        if ((!_AktuellerType.IsAbstract))
                        {
                            try
                            {
                                #region erstelle AppDomain
                                // setze AppDomain-Eigenschaften
                                AppDomainSetup adSetup = new AppDomainSetup();
                                adSetup.ApplicationBase = Environment.CurrentDirectory;
                                // erzeuge die AppDomain
                                AppDomain neuePortalLogikAppDomain = AppDomain.CreateDomain(fileInfo.FullName, null, adSetup);
                                #endregion

                                // erzeuge Objekt vom Typ Server_PortalLader
                                ObjectHandle _PLhandle = neuePortalLogikAppDomain.CreateInstanceFrom(
                                    "Server_PortalLader.dll",
                                    "pELS.Server" + "." + "CPortalLogikLader");
                                // entpacke Objekt
                                CPortalLogikLader _PortalLogikLader = (CPortalLogikLader)_PLhandle.Unwrap();
                                // setze auf die nächste (wahrscheinlich) freie Portnummer
                                _LetztePortNummer++;
                                if (_PortalLogikLader.LadeAssembly(fileInfo.FullName,
                                    _Interner_RemotePort, ServerURL, _LetztePortNummer))
                                {
                                    // starte die PortalLogik
                                    _PortalLogikLader.StartePortalLogik();
                                    // hole den gewählten Port, auf dem die PortalLogik erreichbar ist
                                    _LetztePortNummer = _PortalLogikLader.LiefereRemotingPort();
                                    #region starte PortalDecorator
                                    // lege Namen für zu erzeugende Datei fest
                                    PortalDecoratorName = _AktuellerType.Name + "_Decorator";
                                    // überpüfe, ob die Ausgabedatei geschrieben werden kann
                                    // (falls DLL bereits erzeugt wurde und benutzt wird, kann sie nicht
                                    // mehr geschrieben werden)
                                    FileInfo PortalDecoratorFI = new FileInfo(PortalDecoratorName + ".dll");
                                    // falls sie nicht geschrieben werden kann, erzeuge sie nicht erneut
                                    if(PortalDecoratorFI.Exists)
                                    {
                                        try
                                        {
                                            // überprüfe Zugriffrechte auf diese Datei
                                            PortalDecoratorFI.Delete();
                                            // erzeuge Assembly für den Decorator
                                            CDecoratorDesigner.UebersetzeSourceCode(
                                                // Name der PortalLogik
                                                fileInfo.FullName,
                                                // Name der zu ereugenden Datei
                                                PortalDecoratorName + ".dll",
                                                // Pfad aller Dependencies
                                                AppDomain.CurrentDomain.BaseDirectory,
                                                // SourceCode
                                                CDecoratorDesigner.CreateSourceCode(
                                                _AktuellerType,
                                                PortalDecoratorName,
                                                _LetztePortNummer,
                                                _PortalLogikLader.LieferePortalPfad()));
                                        }
                                        catch
                                        {
                                        }
                                    }
                                    else
                                    {
                                        // erzeuge Assembly für den Decorator
                                        CDecoratorDesigner.UebersetzeSourceCode(
                                            // Name der PortalLogik
                                            fileInfo.FullName,
                                            // Name der zu ereugenden Datei
                                            PortalDecoratorName + ".dll",
                                            // Pfad aller Dependencies
                                            AppDomain.CurrentDomain.BaseDirectory,
                                            // SourceCode
                                            CDecoratorDesigner.CreateSourceCode(
                                            _AktuellerType,
                                            PortalDecoratorName,
                                            _LetztePortNummer,
                                            _PortalLogikLader.LieferePortalPfad()));

                                    }
                                    // erzeuge Objekt vom Typ des PortalDecorator
                                    ObjectHandle _PDhandle = AppDomain.CurrentDomain.CreateInstanceFrom(
                                        PortalDecoratorName + ".dll",
                                        "pELS.Server" + "." + PortalDecoratorName);
                                    // entpacke Objekt
                                    IPortalLogik_Decorator _PortalLogikDecorator = (IPortalLogik_Decorator)_PDhandle.Unwrap();
                                    // starte den Decorator mit einer Verbindung zur PortalLogik
                                    // auf dem übergebenen Port
                                    _PortalLogikDecorator.StarteRemotingObject(_LetztePortNummer);
                                    // speichere Referenz auf den Decorator im PortalWaechter
                                    _PortalWaechter.FuegeDecoratorHinzu(_PortalLogikDecorator);
                                    #endregion
                                    // füge AppDomain zur ArrayList hinzu
                                    _arl_PortalLogik_AppDomains.Add(neuePortalLogikAppDomain);
                                }
                            }
                            catch (System.Exception ex)
                            {
                                this.SetzeSplashScreenStatus("Fehler: "+ex.Message);
                                System.Windows.Forms.MessageBox.Show("Fehler beim Laden der Assemblies: \n"+ex.Message+"\nOrt: pELS.Server.Cap_Server.StarteServerRoutine()");
                            }
                        }
                }
            }
            this.SetzeSplashScreenStatus("ServerStarteRoutine Ende");
            this.SchliesseSplashScreen();
        }
        private bool SchreibeDbNamenInDatei()
        {
            XMLZugriff myXML = new XMLZugriff();
            myXML.LadeDatei(pELS.Tools.Server.CKonstanten._str_ServerConfigPfad);
            myXML.WaehleKnoten("pELS/pELS-Server/DBConfig");
            myXML.SetzeKnotenAttribut(0,"DBName", this.txt_DBName.Text);
            if(myXML.SpeichereDatei() == "")
                return true;
            else
            {
                DialogResult dr_auswahl;
                dr_auswahl = MessageBox.Show("\nDer Vorgang kann so nicht fortgesetzt werden."
                    +"\nStellen Sie sicher, dass die Datei '"
                    + pELS.Tools.Server.CKonstanten._str_ServerConfigPfad
                    +"' vorhanden, nicht beschädigt oder schreibgeschützt ist.",
                    "Änderungen konnten nicht geschrieben werden",
                    MessageBoxButtons.RetryCancel,
                    MessageBoxIcon.Error);

                if(dr_auswahl == DialogResult.Retry)
                    return this.SchreibeDbNamenInDatei();
                else
                    return false;
            }
        }