/// <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; } }