Asynchrone Methoden

roth am Friday, 12.January 2007 um 15:43

Um Laufzeit zu sparen werden oftmals Methoden asynchron ausgeführt, dass heißt diese laufen dann in einem anderen als den Ausgangsthread. Beispiele dafür sind die Druckerausgabe und Streamoperationen. Als Richtwert sollte eine maximale Reaktionszeit von einer Zehntelsekunde auf eine Benutzerreaktion realisiert werden. An Hand eines Beispieles, welches die Größe und die Checksumme einer Datei sowie die Zeitdauer des Asynchronen Streamhandling ermittelt, soll die Umsetzung in C# gezeigt werden. Außerdem wurde berücksichtigt, dass Steuerelemente nicht mit den herkömmlichen Mitteln von einem anderen Thread aus aufgerufen werden können. Realisieren läßt sich dies mit der Control-Methode Invoke(), welche einen Delegaten und ein Objekt-Feld als Parameter erhält.

Delegaten

Der Start der asynchronen Methode erfolgt hier mit einem Button-Click.

BtnStartClick

Der Lesepuffer und die zu ermitteltenden Werte werden in der Klasse AsyncJob zusammengefaßt.

StreamLesen

In der folgenden Methode wird durch den letzten Parameter bei der Instanzierung von fStream festgelegt, dass die Leseoperation asynchron vorgenommen wird. In der Methode BeginRead wird außerdem die CallBack-Methode festgelegt.

ChecksummeLesen

Wenn der Puffer gefüllt ist wird die Rückrufmethode aufgerufen, wird die Checksumme aktualisiert und die Label-Steuerelemente werden benachrichtigt, die Werte auszugeben.

MyCallBack

Die SetStatus-Methode führt die eigentliche Aktualisierung der Steuerelemente auf dem Hauptthread aus.

SetStatus

Stellvertretend für die Ausgabe-Methoden sei hier die Funktion für die Aktualisierung des Labels für die Anzeige der Dateigröße angeführt.

SetByteText

Der Vollständigkeit halber sei darauf verwiesen,dass das Flag FortsetzenAsynchron beim Ereignis Close des Hauptfensters der Anwendung auf false gesetzt werden sollte, damit die asynchrone Methode ebenfalls ihre Aktionen einstellt.

XP-Style Manifest

roth am Wednesday, 3.January 2007 um 13:23

Der optische Stil des Non-Client-Area wird durch die ComCtrl32.dll realisiert. Mit der Version 6 darf dies nicht mehr mit den Anwendungen weitergegeben werden. Daher suchen Anwendungen standardmäßig die Version 5 auf dem Zielsystem. Für die meisten Steuerelemente wird die XP-Optik mit der Version 6 der ComCtrl32.dll umgesetzt, für Buttons, die Groupbox und die Checkbox z.B. erfolgt dies jedoch nicht. Um dennoch diesen Stil zu verwenden ist das Flag FlatStyle in den Eigenschaften des Steuerelements auf System zu stellen (die anderen Einstellmöglichkeiten sind: Flat, Popup und Standard). Der Flatstyle kann natürlich auch dynamisch in Abhängigkeit vom Betriebssystem eingestellt werden. Das hat den Vorteil, dass für ältere Anwendungen das Flag der Steuerelemente nicht geändert werden braucht.
Um den Steuerelementen mitzuteilen, dass sie die Version 6 der ComCtrl32.dll verwenden sollen, ist im Pfad der Anwendung eine XML-basierte Manifest-Datei einzufügen. Diese muss dem Namensmuster Anwendungsname.exe.manifest genügen und hat folgenden Inhalt:

  • <?xml version=”1.0″
    • encoding=”UTF-8″
    • standalone=”yes”?>
  • <assembly
    • xmlns=”urn:schemas-microsoft-com:asm.v1″
    • manifestVersion=”1.0″>
  • <dependency>
  • <dependentAssembly>
  • <assemblyIdentity
    • type=”win32″
    • name=”Microsoft.Windows.Common-Controls”
    • version=”6.0.0.0″
    • processorArchitecture=”X86″
    • publicKeyToken=”6595b64144ccf1df”
    • language=”*”
  • />
  • </dependentAssembly>
  • </dependency>
  • </assembly>

Buttons mit Bildern, wie sie im alten Look möglich waren, kennt der XP-Stil allerdings nicht; diese Buttons werden dann ohne Bilder angezeigt. Die Weitergabe der Anwendung erfolgt entweder zusammen mit der Manifest-Datei oder die Manifest-Datei wird als Ressource eingebunden. Dazu wählt man den Menüpunkt zum Hinzufügen einer neuen Ressource. In dem sich öffnenden Dialog wird dann die ‘.manifest’-Datei geladen. Der Typ der Ressource ist RT_MANIFEST und die ID ist 1.

MailMessage

roth am Wednesday, 3.January 2007 um 13:21

Die Daten die zum Versenden einer E-Mail aus einer Anwendung benötigt werden verwaltet die Klasse MailMessage, welche sich im Namespace System.Net.Mail befindet. Für die Erzeugung der notwendigen Einstellungen zum Versenden werden außerdem noch Instanzen der Klassen:

  • MailAddress
  • Attachment
  • SmtpClient
  • NetworkCredential
  • CredentialCache

erzeugt. MailAddress wird einfach mit einer E-Mail-Adresse und Attachment mit einem Dateinamen instanziert. Die Objekte werden dann jeweils den Eigenschaften From und To bzw. der Collection Attachments des MailMessage- Objektes zugewiesen. Noch einfacher ist das Setzen der Betreffzeile(Subject) und des Inhaltes(Body) durch string-Objekte. Der SmtpClient wird mit der Adresse des Mailout-Servers und dem Port (gewöhnlich 25) instanziert und versendet die E-Mail. NetworkCredential verwaltet die Server-Zugangsdaten(Benutzer,Passwort) und CredentialCache die ggf. verschiedenen Zugangsdaten und Serveradressen.
Ein einfaches Code-Beispiel:

  • string server = “mailout.de”;
  • string user = “user”;
  • string pass = “passwort”;
  • using System.Net.Mail;
  • MailMessage msg = new MailMessage();
  • msg.From = new MailAddress(”absender@net.de”);
  • MailAddress e1 = new MailAddress(”e1@net.de”);
  • msg.To.Add(e1);
  • msg.Subject = “Betreff”;
  • msg.Body = “Blabla”;
  • Attachment at = new Attachment(”datei.txt”);
  • msg.Attachments.Add(at);
  • SmtpClient sc = new SmtpClient(server,25);
  • NetworkCredential nc= new NetworkCredential(user,pass);
  • CredentialCache cc = new CredentialCache();
  • cc.Add(server,25,”Basic”,nc);
  • sc.DeliveryMethod = SmtpDeliveryMethod.Network;
  • sc.Credentials = cc.GetCredential(server,25,”Basic”);
  • sc.Send(msg);

Die Zugangsdaten sind sinnvollerweise nicht ungeschützt zu speichern. Dazu kann die Klasse IsolatedStorageFile im Namespace System.IO genutzt werden.

Isolierter Speicher

roth am Wednesday, 3.January 2007 um 13:19

Anwendungen können mit dem isolierten Speicher Daten in einem eigenen Abschnitt des Dateisystems speichern, ohne dass sie einen bestimmten Pfad angeben zu müssen. Der Gültigkeitsbereich von isoliertem Speicher ist auf die jeweilige Assembly zugeschnitten, so dass die Daten nur einmal eingegeben werden müssen. Vertrauenswürdiger Code, Verwaltungstools und nicht verwalteter Code können auf den isolierten Speicher ebenfalls zugreifen.

Das folgende Code-Beispiel soll an Hand der Klassen IsolatedStorageFile und IsolatedStorageFile das Speichern von Zugangsdaten für das Versenden von E-Mails demonstrieren. Es wurden vier Alternativen berücksichtigt:

1.Der User meldet sich mit seinen Daten das erste mal an.
2.Die Zugangsdaten sind bereits gespeichert und werden ausgelesen.
3.Es sollen neue Zugangsdaten gespeichert werden.
4.Alle gespeicherten Zugangsdaten sollen gelöscht werden.

Der vereinfachte Code für die Anwendung (ohne Implementierung der Ein/Ausgaben und Ausnahmebehandlung):

  • class Mailzugang
  • {
    • [STAThread]
    • static void Main(string[] args)
    • {
      • neueslogin = GetSpeicher(username);
      • if (neueslogin)
        • SetSpeicher();
      • else
      • {
        • if(andereslogin)
          • SetNeuenSpeicher();
        • if(loeschen)
          • Loeschen();
      • }
    • }
  • }

Für dieses Beispiel sind in der Klasse Mailzugang die Variablen/Eigenschaften aufzunehmen:

  • //die zu speichernden Daten
  • string server;
  • string loginname;
  • string passwort;
  • //Identifizierung der Daten
  • //hier der am Rechner angemeldete Benutzer
  • string username = Environment.UserName;
  • //Flag für die Speicherung
  • //true=noch kein Speicher angelegt
  • //false=Speicher bereits angelegt
  • bool neueslogin;
  • //Flag für die Speicheränderung
  • //true=Ändern des Speichers
  • //false=Auslesen des Speichers
  • bool andereslogin;
  • //Flag für die Löschung des Speichers
  • bool loeschen;

Die Implementierung der Methoden der Klasse Mailzugang:

  • bool GetSpeicher()
  • {
    • try
    • {
    • IsolatedStorageFile iFile =
      • IsolatedStorageFile.GetStore(
        • IsolatedStorageScope.User |
        • IsolatedStorageScope.Assembly |
        • IsolatedStorageScope.Domain,
        • null,null);
    • IsolatedStorageFileStream iStream =
      • new IsolatedStorageFileStream(
        • this.username,
        • FileMode.Open,
        • FileAccess.Read,
        • FileShare.Read);
    • StreamReader reader =
      • new StreamReader(iStream);
    • this.server    = reader.ReadLine();
    • this.loginname = reader.ReadLine();
    • this.passwort  = reader.ReadLine();
    • reader.Close();
    • iFile.Close();
    • return false;
    • }
    • catch (System.IO.FileNotFoundException)
    • {
      • // Wenn keine Datei gefunden werden kann,
      • // muss es sich um einen neuen Nutzer handeln
      • return true;
    • }
  • }
  • void SetSpeicher()
  • {
    • IsolatedStorageFile iFile =
      • IsolatedStorageFile.GetUserStoreForDomain();
    • IsolatedStorageFileStream iStream =
      • new IsolatedStorageFileStream(
        • this.username,
        • FileMode.OpenOrCreate,
        • FileAccess.Write,
        • iFile);
    • StreamWriter writer =
      • new StreamWriter(iStream);
    • writer.WriteLine(this.server);
    • writer.WriteLine(this.loginname);
    • writer.WriteLine(this.passwort);
    • writer.Close();
    • iFile.Dispose();
    • iFile.Close();
  • }
  • SetNeuenSpeicher()
  • {
    • byte input;
    • IsolatedStorageFile iFile =
      • IsolatedStorageFile.GetStore(
        • IsolatedStorageScope.User |
        • IsolatedStorageScope.Assembly |
        • IsolatedStorageScope.Domain,
        • typeof(System.Security.Policy.Url),
        • typeof(System.Security.Policy.Url));
    • if (! this.neueslogin)
    • {
      • if ( iFile.GetDirectoryNames(
        • “Archive”).Length == 0 )
        • iFile.CreateDirectory(”Archive”);
      • else
      • {
        • IsolatedStorageFileStream source =
          • new IsolatedStorageFileStream(
            • this.username,
            • FileMode.OpenOrCreate,iFile);
        • IsolatedStorageFileStream target =
          • new IsolatedStorageFileStream(
            • “Archive\\ ” + this.username,
            • FileMode.OpenOrCreate,
            • FileAccess.Write,
            • FileShare.Write,
            • 10240,
            • iFile);
        • if (!(source.IsAsync && target.IsAsync))
        • {
          • while (source.Position < source.Length)
          • {
            • input = (byte)source.ReadByte();
            • target.WriteByte(inputChar);
          • }
        • }
        • target.Close();
        • source.Close();
      • }
    • }
    • IsolatedStorageFileStream iStream =
      • new IsolatedStorageFileStream(
        • this.username,
        • FileMode.OpenOrCreate,
        • FileAccess.Write,
        • FileShare.Write,
        • 10240,
        • iFile);
    • iStream.Position = 0;
    • StreamWriter writer = new StreamWriter(iStream);
    • writer.WriteLine(this.Server);
    • writer.WriteLine(this.loginname);
    • writer.WriteLine(this.passwort);
    • writer.Close();
    • iFile.Close();
  • }
  • void Loeschen()
  • {
    • IsolatedStorageFile iFile =
      • IsolatedStorageFile.GetStore(
        • IsolatedStorageScope.User |
        • IsolatedStorageScope.Assembly |
        • IsolatedStorageScope.Domain,
        • typeof(System.Security.Policy.Url),
        • typeof(System.Security.Policy.Url));
    • string [] dirNames  = iFile.GetDirectoryNames(”*”);
    • string [] fileNames = iFile.GetFileNames(”*”);
    • if (fileNames.Length>0)
    • {
      • for (int i=0;i<fileNames.Length;++i)
      • {
        • iFile.DeleteFile(fileNames[i]);
      • }
      • fileNames = iFile.GetFileNames(”*”);
    • }
  • }

Das Auflisten und Entfernen der Dateien im isolierten Speicher kann mit dem Isolated Storage-Tool Storeadm.exe erfolgen. Um IsolatedStorage-Klassen zu verwenden ist der Namespace System.IO.IsolatedStorage für die Speicherreservierung mit GetStore() der Namespace System.Security.Policy einzubinden.

Resourcen

roth am Monday, 13.November 2006 um 11:36

Zum Erstellen von Resourcen werden das Programm resgen und speziell für Forms-Elemente das Programm winres verwendet. In den Entwicklungsoberflächen sind diese meist bereits integriert.

1. Manuelles Erstellen von string-Resourcen
Zuesrt erstellt man eine *.txt-Datei nach dem Schema

  • name=wert

Danach ruft man

  • resgen dateiname.txt

in der Eingabeaufforderung auf und es wird die binäre Resourcen-Datei dateiname.resources erzeugt. Soll diese einen anderen Namen erhalten ist dieser an den Befehl anzuhängen.

2. Manuelles Erstellen von Resourcen mit Hilfe der Klassenbibliothek
Um z. B. Bilder oder Musik in Resourcen zu verpacken erzeugt man zuerst *.resx-Dateien. Dies am sinnvollsten mit der Klasse ResXResourceWriter:

  • Image img
    = Image.FromFile(”muster.jpg”);
  • ResXResourceWriter rrw
    = new ResXResourceWriter(”muster.resx”);
  • rrw.AddResource(”muster.jpg”,img);
  • rrw.Close();

Die *.resx-Datei kann dann wiederum mit resgen in eine *.resource-Datei gewandelt werden.

3. Lokalisieren von Anwendungen
Um Anwendungen in mehreren Sprachen zu erstellen, werden diese lokalisiert. Das bedeutet man erzeugt Resourcen-Dateien in verschiedenen Sprachen, welche zur Laufzeit entsprechend der Sprache des Anwendungssystems eingebunden werden. Wird keine Resource für das entsprechende Anwendersystem gefunden (die lokalisierte Kultur ist auf dem System nicht vorhanden) wirkt das Ressourcenfallback, welches eine Standardresource verwendet. Die verschiedenen Sprachversionen der Resourcen müssen in eigenen Ordnern unter der Anwendung plaziert werden. Die Sprach- und Länderbezeichnung ist fest vorgegeben. So bedeutet z.B.

  • de deutsch
  • de-DE deutsch Deutschland
  • de-AT deutsch Österreich
  • en englisch
  • fr französisch

(Die Dateien mit Länderbezeichnung (z.B. de-DE) befinden sich in den Ordnern der Sprachbezeichnung (z.B. de)

Mit Visual Studio und SharpDevelop können Windows-Anwendungen im Designer wie folgt lokalisiert werden:

  • Die Form-Eigenschaft Localizable des Fensters auf True stellen.
  • Die Eigenschaft Language auf Standard stellen.
  • Die einzelnen Steuerelemente anwählen und die Eigenschaft Text in der Standardsprache eintragen.
  • Danach die Language-Eigenschaft des Fensters auf die gewünschte Sprache umstellen und die Steuerelemente erneut anwählen und nun in der jeweiligen Sprache die Text-Eigenschaft bedienen.

Mit dem Kompilieren werden für alle eingestellten Sprach- bzw. Kulturversionen sogenannte Satellitenassemblies (DLL) erstellt. Unter Einhaltung der Namenskonventionen in den Resourcen können damit Anwendung und Resource unabhängig voneinander ausgetauscht werden. Soll die zu verwendende Sprach- bzw. Kulturversion von der Anwendung selbst und nicht vom Anwendersystem bestimmt werden, muss vor Aufruf der Methode InitializeComponent die Einstellung der entsprechenden Version vorgenommen werden:

  • Thread.CurrentThread.CurrentUICulture
    = new CultureInfo(”de-DE”);

Werden außer den Steuerelementobjekten weitere lokalisierte Resourcen benötigt, z.B. für dynamisch zu ändernde Texte, sind diese den sprachverschiedenen Resourcendateien der IDE hinzuzufügen.

4. Einlesen lokalisierter Resourcen
Um Resourcen zur Laufzeit zu verwenden, wird der ResourcenManager verwendet.
Variante 1
Man instanziert mit einem der drei möglichen Konstruktoren von ResourceManager.
Beispiel:

  • ResourceManager rm
    = new ResourceManager(
    “namespace.MainForm”,
    this.GetType().Assembly);
  • CultureInfo ci = new CultureInfo(”en”);
  • this.Text = rm.GetString(”Titel”,ci);

Soll die Sprach- bzw. Kulturversion der Anwendung angezeigt werden, kann natürlich auf die Angabe der CultureInfo verzichtet werden.

Variante 2
Man erzeugt einen ResourceManager mit der statischen Methode CreateFileBasedResourceManager. Dies dient dem Zugriff auf Resourcen in einem bestimmten Verzeichnis.

  • ResourceManager rm
    = ResourceManager.
    CreateFileBasedResourceManager(
    “baseName”, “./path”, null);

 

5. Assembly-Linker-Tool
Mit dem Assembly-Linker-Tool Al.exe. können Ressourcen-dll auch mit der Konsole erzeugt werden. Beispiel:

  • al /t:lib
    • /embed: name.de.resources
    • /version:1.0.0.1
      /culture:de
    • /out:name.resources.dll

Testen mit NUnit

roth am Wednesday, 30.August 2006 um 12:08

Speziell zum Testen von NET.DLL’s eignet sich das Programm NUnit (derzeitige Version 2.2) welches unter http://www.nunit.org/ kostenlos downzuloaden ist. Verwenden lässt sich dieses Testprogramm sowohl als Konsolenprogramm mit nunit-console.exe als auch mit Windowsoberfläche mit nunit-gui.exe. Eine Konfiguration ist über die XML-Konfigurationsdateien nunit-console.exe.config bzw. nunit-gui.exe.config möglich. Die Anwendung ist wie folgt zu realisieren:

  • Die Klassenbibliothek “nunit.framework.dll” ist in das Verzeichnis der zu testenden Anwendung zu kopieren.
  • Um NUnit anzuwenden, muss die zu testende Klasse mit dem Attribut [Serializable] versehen werden und ein Verweis mit using namespace NUnit::Framework;” bei Managed Extensions bzw. mit “using NUnit.Framework;” herzustellen.
  • Für die Aufnahme der Testfunktionen ist ein Klassenbibliothek-Projekt zu erstellen, welches sich sinnvollerweise in der gleichen Projektmappe wie die zu testende Anwendung befindet.
  • Die Testklasse erhält das Attribut [TestFixture].
  • Zur Initialisierung kann eine Funktion das Attribut [SetUp] erhalten.
  • Alle Testfunktionen sind vom Typ: public: void TestFunktion(void) und erhalten das Attribut [Test].
  • Über den Button “Help”/”About Unit” lässt sich die verwendete NET-Framework-Version(1.0, 1.1, 2.0) feststellen (GUI-Variante).

Man unterscheidet bei den Tests zwischen Vergleichen, Wahrheitstest und sonstige Methoden. Alle Tests werden über statische Methoden der Klasse Assert in den Testfunktionen aufgerufen. Der Aufruf kann ohne oder mit Nachricht und/oder Objektparametern erfolgen. Diese sind vom Typ string(String*) bzw.  object[] (Object* params __gc[] ); in Klammern die Managed Extension-Version. Nachricht und Objektparameter werden als letzte Parameter in dieser Reihenfolge übergeben.

1. Vergleichen:

Assert.AreEqual(typ erwartet, typ aktuell … ); als typ kann verwendet werden: int, decimal, float, double, object. Die Typen float und double erhalten noch einen zusätzlichen Parameter für die Toleranz, welcher als dritter parameter übergeben wird.

Assert.AreSame(object erwartet, object aktuell …) testet ob beide Parameter auf das gleiche Objekt verweisen. AreEqual testet dagegen nur, ob die gleichen Werte vorliegen.

2. Wahrheitstests:

Assert.IsTrue / IsFalse(bool …)

Assert.IsNull / IsNotNull(object …)

3. Sonstige Methoden:

Hier existieren die Methoden Fail und Ignore. Fail löst eine Assertion aus, Ignore verhindert die weitere Durchführung des Tests.

Im Programm NUnit wird zum Testen der Anwendung die Test-Klassenbibliothek geladen, wobei zu beachten ist, dass bei Änderungen und Neukompilierung diese erneut geladen wird. Danach wird der Test mit “Run” gestartet. Das Ergebnis wird in der GUI-Variante wie folgt farbig dargestellt:

Grün: Der Test verlief erfolgreich.

Rot: Der Test wurde mit einer Assertion abgebrochen, ggf. werden die übergebenen Textmeldungen zusätzlich ausgegeben.

Gelb: Der Test wurde nicht durchgeführt.

Weitere Attribute:

[ExpectedException(typeof(…))] - der Test läuft auch bei Auslösen der entsprechenden Ausnahme weiter.

[Category(”Kategoriename”)] - dient dem Gruppieren von Tests und wird auf Methoden angewandt, welche das [Test]-Attribut erhalten haben.

Explicit zusätzlich in [TestFixture] oder [Test] um diesen Test auszuschließen und diesen separat durchzuführen.

Konfigurationsdatei

roth am Monday, 21.August 2006 um 18:00

Konfigurationsdateien
Konfigurationsdateien werden eingesetzt, um Einstellungen für Anwendungen zu verändern ohne diese neu kompilieren zu müssen. Ähnlich den INI-Dateien und den Registry-Einträgen können damit auch im NET-Framework die Anwendungen den persönlichen Bedürfnissen angepasst werden. Die Speicherung der Konfiguration erfolgt im XML-Format. Man unterscheidet Konfigurationsdateien für Computer, Sicherheit und Anwendungen.

A. Computerkonfiguartionsdateien
Enthält Einstellungen, welche für den gesamten Computer gelten. Sie befinden sich im: %Installationspfad der CLR% \ Config \ Machine.config

B. Sicherheitkonfigurationsdateien
Enthalten Informationen zur Codegruppenhierarchie und zu Berechtigungen, die einer Richtlinienebene zugeordnet sind. Man unterscheidet:

  • Unternehmensrichtlinien in %Installationspfad der CLR% \ Config \ Enterprisesec.config
  • Computerrichtlinien in %Installationspfad der CLR% \ Config \ Security.config
  • Benutzerrichtlinien in %BENUTZERPROFIL%\Application data\Microsoft\CLR security config\vxx.xx\Security.config

C. Anwendungskonfiguartionsdateien
Diese Dateien enthalten z.B. Assemblybindungsrichtlinien, Remotingobjekte und Anwendungseinstellungen. Folgende Bedingungen sind dabei zu beachten:

  • Die Konfigurationsdatei hat den Namen: Name_der_Anwendung.config bzw. bei von ASP.NET gehosteten Anwendungen Web.config
  • Die Konfigurationsdatei befindet sich im gleichen Verzeichnis wie die zu konfigurierende Anwendung
  • Das Root-Element der Konfigurationsdatei lautet <configuration>
  • Die Konfigurationsdateien sind nicht für den Einsatz in Multiuser-Umgebungen geeignet.

 

1. Schlüssel/Wert-Paare
Die einfachste Art Konfigurationseinstellungen vorzunehmen ist die Verwendung des Tags <appSettings>, welcher das Speichern von Schlüssel/Wert-Paaren realisiert.
Beispiel:

  • <configuration>
    • <appSettings>
      • <add key=”Farbe” value=”#669933″/>
      • <add key=”Datei” value=”name.txt”/>
    • </appSettings>
  • </configuration>

Das Auslesen der Konfigurationsdatei erfolgt im Konstruktur der Anwendung mit der statischen Eigenschaft AppSettings der Klasse ConfigurationSettings.
Beispiel:

  • NameValueCollection cfg
  • = ConfigurationSettings.AppSettings;
  • this.BackColor
  • = Color.FromName((string) cfg[”Farbe”]);
  • this.File
  • = (string) cfg[”Datei”];

Zur Demonstration steht ein Beispielprogramm und dessen Quelltext zum Download.

2. Sektionen
Komplexere Konfigurationen lassen sich mit der Definition von Sektionen realisieren. Doppelt verwendete Schlüssel-Namen sind damit kein Problem mehr. Umgesetzt wird dies durch die Tags <configSections>und <section>. Das Attribut “type” erhält in der Mehrzahl der Fälle als Wert einen der zwei Klassennamen SingleTagSectionHandler oder NameValueSectionHandler .
Beispiel:

  • <configuration>
    • <configSections>
      • <section name=”Sektion1″
      • type=”System.Configuration
      • .SingleTagSectionHandler”/>
    • </configSections>
    • <Sektion1 Farbe=”#669933″
    • Datei=”name.txt”/>
  • </configuration>

Das Auslesen erfolgt hier ähnlich wie bei 1. mit der Methode GetConfig() der Klasse ConfigurationSettings.
Beispiel:

  • IDictionary skin
  • =(IDictionary) ConfigurationSettings.GetConfig(”Sektion1″);
  • this.File
  • =(string) Sektion1[”Datei”];
  • this.BackColor
  • =Color.FromName((string) Sektion1[”Farbe”]);

 

3. Erweiterte Sektionen
Um die Konfigurationsdaten in einer Baumstruktur zu ordnen, wird zusätzlich zu 2. das Tag <sectionGroup> mit dem Attribut “name” verwendet.
Beispiel:

  • <configuration>
    • <configSections>
      • <sectiongroup name=”Gruppe1″>
        • <section name=”Sektion1″
        • type=”System.Configuration
        • .NameValueSectionHandler,
        • system,
        • Version=1.2.3456.0,
        • Culture=neutral,
        • PublicKeyToken
        • =123456789abcdef0″/>
        • <section name=”Sektion2″
        • type=”System.Configuration
        • .NameValueSectionHandler,
        • system,
        • Version=1.2.3456.0,
        • Culture=neutral,
        • PublicKeyToken
        • =123456789abcdef0″/>
      • </sectionGroup>
    • </configSection>
    • <Gruppe1>
      • <Sektion1 Color=”#669933″
      • File=”name1.txt”/>
      • <Sektion2 Color=”#996633″
      • File=”name2.txt”/>
    • </Gruppe1>
  • </configuration>

Für das Auslesen der Konfigurationsdatei müssen mehrere Dictionary-Objekte erzeugt werden, welche mit dem entsprechenden Pfadausdruck als Parameter aus dem Rückgabewert der Methode GetConfig() erhalten werden.
Beispiel:

  • IDictionary sec1
  • =(IDictionary)ConfigurationSettings
  • .GetConfig(”Gruppe1/Sektion1″);
  • this.Color1
  • = Color.FromName((string) sec1[”Color”]);
  • this.File1
  • = (string) sec1[”File”];
  • IDictionary sec2
  • = (IDictionary) ConfigurationSettings
  • .GetConfig(”Gruppe1/Sektion2″);
  • this.Color2
  • = Color.FromName((string) sec2[”Farbe”]);
  • this.File2 = (string) sec2[”Datei”];

 

Sonstige Einstellungen
Zur Angabe der von der Anwendung unterstützten Framework-Version:

  • <startup>
    • <supportedRuntime version=”v1.1.4322″/>
  • </startup>

Zur Angabe wo eine Assembly gefunden werden kann:

  • <codeBase version=”1.2.3.0″
  • href=”http://www.twox.de/source/ass.dll” mce_href=”http://www.twox.de/source/ass.dll” />

Attribute

roth am Monday, 31.July 2006 um 16:04

Attribute des Framework(Auszug)

1. [AttributeUsage(AttributeTargets::Method, AllowMultiple=true,  Inherited=true)]

Wird zur Steuerung der Verwendung benutzerdefinierter Attribute verwendet. Es besitzt die

Eigenschaften: AttributeTargets ValidOn{ get;} ; bool AllowMultiple{ get: set;} ; bool Inherited{ get; set;}

AttributeTargets verweist auf den Art des atrributierten Programmelements. Verwendet werden können:All, Assembly, Class, Constructor, Delegate, Enum, Event, Interface, Method, Field, Module, Parameter, Property, ReturnValue, Struct. AllowMultiple gibt an, ob für ein Programmelement mehr als eine Instanz des Attributes angegeben werden kann. Inherited legt fest, ob das Attribut von abgeleiteten Klassen oder überschriebenen Membern überschrieben werden darf.

2. [Flag]

Eine Enumeration wird als Bitfeld festgelegt. Das bedeutet, die Enumerationskonstanten können mit dem bitweisen OR-Operator behandelt werden.

3. [Description(”Beschreibung”)]

Beschreibung für eine Eigenschaft oder ein Ereignis.

4. [assembly:CLSCompliant(true)]

Gibt an, ob ein Programmelement mit der CLS kompatibel ist. Jeder öffentlich gemachte aber nicht CLS-kompatible Typ muss mit diesem Attribut mit dem Parameter false gekennzeichnet werden (z.B. UInt32). Wenn mit assembly attributiert wird, ist das Attribut auf die geamte Assembly angewendet.

5. [Serializable], [NonSerialized]

Die Anwendung dieser Attribute ist im Artikel Serialisieren beschrieben.

6. STAThread

Mit STAThread wird Singlethreaded Apartment als COM-Threadingmodell für Anwendungen festgelegt.

Benutzerdefinierte Attribute:

Eigene Attribute sollten immer von der Klasse System::Reflection::Attribute abgeleitet werden. Die benutzerdefinierte Attributklasse muss mit dem Attribut AttributUsage (siehe oben) markiert werden und sollte geeignete Konstruktoren und Eigenschaften aufweisen.  

Der Zugriff auf die Attribute erfolgt mit der Klasse MemberInfo, welche an die Klasse gebunden wird, deren Attribute erfragt werden sollen. Mit der Methde GetCustomAttributes dieser Klasse wird dann auf die Attribute zugegriffen.

  • MemberInfo* pInfo =
  •     __typeof(Klassenname);
  • Object* att __gc[];
  • att = pInfo->GetCustomAttributes(
  •     __typeof(Attributname),true);
  • for( int i = 0; i < attributes->Length; i++ )
  • {
    • Console::Write((__try_cast(
    •     attributes[i]))->Eigenschaft) ;
  • }

Für das Abrufen von Informationen aus einer .NET-DLL kann das Dienstprogramm  ILDASM.exe, welches in der Standardinstallation von Visual.NET enthalten ist, verwendet werden. Der Namensraum System.Reflection.Emit enthält Klassen,um Typen zur Laufzeit zu erstellen. Demoprogramm und Quellcode
 

Exception

roth am Friday, 21.July 2006 um 18:39

Vordergründig sollte man vordefinierte Ausnahmetypen verwenden. Benutzerdefinierte Ausnahmetypen definiert man daher nur für programmspezifische Szenarien. Sie sollten nicht von der Exception-Basisklasse abgeleitet werden. Für die meisten Anwendungen ist die Ableitung von der ApplicationException-Klasse am geeignetsten. Der Name einer benutzerdefinierten Ausnahmeklasse sollte mit Exception enden.

Benutzerdefinierte Ausnahmen sollten die folgenden allgemeinen Konstruktoren enthalten, das Attribut [Serializable] besitzen und die Schnittstelle ISerializable mit der GetObjectData()-Methode implementieren.

  • [Serializable]
  • public class BenutzerException
                 : ApplicationException,
  •                ISerializable
  • {
    • public BenutzerException(){}
    • public BenutzerException(string msg)
    •        :base(msg){}
    • public BenutzerException(string msg,
    •                          Exception exc)
    •        :base(msg,iexc){}
    • public BenutzerException(
    •                SerializationInfo info,
                     StreamingContext context)
    •        :base(info,context){}
  • }

Werden zusätzliche Variablen in die Klasse aufgenommen sind diese nicht public und ggf. als Eigenschaft zu deklarieren. Durch überschreiben der Eigenschaft “Message” können diese Variablen in die Fehlerbenachrichtigung aufgenommen werden.

Die üblichen try-catch-Blöcke zum Auffangen von Ausnahmen können auch verschachtelt werden, so dass eine aufgefangene Ausnahme das Auslösen einer anderen Ausnahme bewirkt. Die Ausnahmen werden umgebrochen bzw. weitergeleitet. Dazu wird im catch-Block am Ende sinngemäß der Code

  • throw new Exception ( “Nachricht.”, e );

plaziert. Zwischen den Konfigurationen Debug und Release ist zu beachten, dass verschiedene Werte aus der Debug-Variante in der Release-Variante (wie z.B. die Zeilennummer) nicht zur Verfügung stehen und demzufolge auch nicht angezeigt werden können (bei der Zeilennummer z.B. ist dies in der Eigenschaft StackTrace). Letztendlich kann noch der finally-Block für Aufräumarbeiten wie Schließen einer Datei oder eines Streams genutzt werden. 

Das Beispiel-Programm “Ausnahmen.exe (in Ausnahmen.zip)” demonstriert die Verschachtelung von try-catch-Blöcken mit dem Speichern der Ausnahmeinformationen, welche dann über ein nichtmodales Fenster angezeigt werden können.

Beispielcode: XmlException-Klasse

Die XmlException wird ausgelöst, wenn ein an den XmlTextReader übergebener Code nicht wohlgeformt ist.
 

  • XmlTextReader tr       
  •    = new XmlTextReader( “datei.xml” );
  • XmlValidatingReader vr
  •    = new XmlValidatingReader(tr);
  • vr.ValidationType = ValidationType.None;
  • try
  • {
    • while(vr.Read());
  • }
  • catch(XmlException exc)
  • {
    • string err;
    • err += exc.Message + “\n”     +
    •        “Ausnahme auf Zeile: ” +
    •        exc.LineNumber         +
    •        “, Position: “         +
    •        exc.LinePosition + “\n”;
    • MessageBox.Show(err);
  • }

Serialisieren

roth am Monday, 17.July 2006 um 17:34

Um die Daten von Klassen für die Speicherung und Wiederherstellung zu serialisieren, gibt verschiedene Möglichkeiten.
1. Einfache Serialisierung:
Die zu serialisierende Klasse wird mit dem Attribut [Serializable] versehen. Es werden alle Membervariablen serialisiert.
2. Benutzerdefinierte Serialisierung:
Wie 1. , die zu serialisierende Klasse implementiert aber die Schnittstelle ISerializable. Es muss

void GetObjectData ( SerializationInfo* info,
                     StreamingContext   context )

und der spezielle Deserialisierungs-Konstruktor

protected MyClass ( SerializationInfo* info,
                    StreamingContext   context )

implementiert werden. Damit kann die Serialisierung bzw. die Deserialisierung zusätzlich beeinflusst werden, um z.B. die Konsistenz der Daten zu garantieren. Der Zugriff auf vertrauliche Informationen über die Methode GetObjectData kann noch durch das Attribut

[ SecurityPermissionAttribute
  ( SecurityAction::Demand,
    SerializationFormatter = true )]

eingeschränkt werden. Beispiel:

  • [Serializable]
  • public __gc class Class2Serial
                      : public ISerializable
  • {
    • public:
    • String* serialVariable;
    • Class2Serial ( String* strVar )
    • {
      • serialVariable = strVar;
    • }
    • void GetObjectData (
                SerializationInfo* info,
                StreamingContext   context )
    • {
      • info->AddValue ( “serialVariable”,
                         serialVariable );
    • }
    • protected:
    • Class2Serial ( SerializationInfo* info,
                     StreamingContext   context)
    • {
      • serialVariable
           = info->GetString (
                    S”serialVariable” );
    • }
  • } ;

3. Deserialisieren von ausgeschlossenen Membervariablen
Um das Datenvolumen zum Serialisieren zu reduzieren, können nicht notwendigerweise zu serialisierende Daten, welche z.B. nur von anderen Variablen abhängig sind, von der Serialisierung ausgeschlossen werden. Bei der Deserialisierung muss natürlich dafür gesorgt werden, dass diese wieder hergestellt werden. Dies realisiert die in der Schnittstelle IDeserializationCallback enthaltene Methode

void OnDeserialization ( Object* sender ),

welche implemtiert werden muss. Diese wird dann nach dem Deserialisierungs-Konstruktor aufgerufen und stellt die Konsistenz der Daten her. Die Serialisierung erfolgt wie bei 2. mit GetObjectData, die Deserialisierung mit dem Deserialisierungs-Konstruktor.
Beispiel:

  • [Serializable]
  • public __gc class Class2Serial
                      : public IDeserializationCallback
  • {
    • public:
    • String* serialVariable;
    • [NonSerialized]
    • String* nonserialVariable;
    • public Class2Serial( String* strVar )
    • {
      • serialVariable    = strVar;
      • nonserialVariable = String::Concat(
                            S”Wert=”, strVar );
    • }
    • // Memberfunktion von IDeserializationCallback
    • void OnDeserialization ( Object* sender )
    • {
      • nonserialVariable = String::Concat(
                            S”Wert=”,
                            serialVariable );
    • }
    • // Methode von ISerializable zum Serialisieren
    • void GetObjectData (
                SerializationInfo* info,
                StreamingContext   context)
    • {
      • info->AddValue ( S”serialVariable”,
                         serialVariable );
    • }
    • // Deserialisierungs-Konstructor
    • protected:
    • Class2Serial ( SerializationInfo* info,
                     StreamingContext   context )
    • {
      • serialVariable
          = info->GetString (S”serialVariable”);
    • }
  • };

4. Serialisieren mit Surrogaten
Wenn Klassen implementiert werden, welche das Attribut [Serializable] nicht besitzen, muss eine Klasse implementiert werden, die die Schnittstelle ISerializationSurrogate einbezieht. Diese Klasse kann dann wie die vorgehenden Klassen serialisiert werden. Dazu sind die Methoden

void GetObjectData ( Object*            obj,
                     SerializationInfo* info,
                     StreamingContext   context )

und

Object* SetObjectData ( Object*             obj,
                        SerializationInfo*  info,
                        StreamingContext    context,
                        ISurrogateSelector* selector )

zu überschreiben.
Beispiel:

  • public __gc class Class2Serial
  • {
    • public:
    • String* serialVariable;
    • Class2Serial (String* strVar)
    • {
      • serialVariable = strVar;
    • }
  • } ;
  • public __gc class Class2SerialSurrogate
                      : public ISerializationSurrogate
  • {
    • public:
    • // Methode zum Serialisieren
    • void GetObjectData (
            Object*            obj,
            SerializationInfo* info,
            StreamingContext   context )
    • {
      • Class2Serial* classSerial
            = __try_cast<Class2Serial*>( obj ) ;
      • info->AddValue (
              S”serialVariable”,
              classSerial->serialVariable );
    • }
    • // Methode zur Deserialisierung
    • Object* SetObjectData (
                Object*             obj,
                SerializationInfo*  info,
                StreamingContext    context,
                ISurrogateSelector* selector )
    • {
      • Class2Serial* classSerial
            = __try_cast<Class2Serial*>( obj ) ;
      • classSerial->serialVariable
            = info->GetString (
                S”serialVariable” );
      • return classSerial;
    • }
  • } ;

5. Serialisieren von Werten aus verschiedenen Klassen
Der Benutzer kann bei dieser Variante bestimmen, welche Klasse für das Serialisieren verwendet werden soll. Dazu wird eine von SerializationBinder abgeleitete Klasse erstellt, welche eine überschriebene Methode

 

Type* BindToType ( String* assemblyName,
                   String* typeName )

enthält. Diese bindet dann die verschiedenen Klassen mit den unter gleichem Namen serialisierten Werten. Die Eigenschaft Binder des Formatters wird dann auf die jeweils zu verwendende Bindung eingestellt. Ebenso können die serialisierten Werte aus verschiedenen Assemblies verwendet werden.
Beispiel:

  • __sealed __gc class Class1ToClass2Binder
                  : public SerializationBinder
  • {
    • public:
    • Type* BindToType ( String* assemblyName,
                         String* typeName )
    • {
      • Type* type   = NULL;
      • String* strT = S”.Class2Serial”;
      • if ( String::Compare( strT,
                        typeName ) == 0 )
      • {
        • typeName = S”.Class2SerialBind”;
      • }
      • String* strTyp
          = String::Format(”{0}, {1}”,
                           typeName,
                           assemblyName);
      • type = Type::GetType( strTyp, true );
      • return type;
    • }
  • } ;

Die Anwendung der verschiedenen Serialisierungen erfolgt nach dem Schema:

  • Erzeugen eines Streams (z.B. FileStream)
  • Ereugen eines Formatters (z.B. BinaryFormatter oder SoapFormatter)
  • Zusätzlich bei der obigen Variante 4.
    • Erzeugen eines Objektes der Surrogaten-Klasse ( im Beispiel Class2SerialSurrogate )
    • Erzeugen eines Objektes der Klasse SurrogateSelector
    • Aufruf der Methode AddSurrogate
  • Zusätzlich bei der obigen Variante 5.
    • Zuweisen der Bindung
  • Serialisierungs-Methode aufrufen mit der Zuordnung von Stream und Objekt
    • bei den Beispielen 1.-3.: Serialize
    • im Beispiel 4.: SurrogateSelector

Beispiel: 

  • SoapFormatter* formatter  = new SoapFormatter ();
  • String*        path       = “Class1.soap”;
  • FileStream*    fileStream = new FileStream ( path,
                                    FileMode::Create );
  • try
  • {
    • Class2Serial* class1
         = new Class2Serial( S”Wert von class1″ );
    • Class2SerialSurrogate* class2
         = new Class2SerialSurrogate();
    • SurrogateSelector* sursel
         = new SurrogateSelector();
    • sursel->AddSurrogate(
              __typeof( Class2Serial ),
              StreamingContextStates::All,
              class2 );
    • formatter->SurrogateSelector = sursel;
    • formatter->Serialize( fileStream, class1 );
    • formatter->Serialize( fileStream, class2 );
  • }
  • catch( Exception* exc)
  • {
    • MessageBox::Show( exc->Message );
  • }
  • __finally
  • {
    • fileStream->Close();
  • }

Analog erfolgt die Deserialisierung:

  • Erzeugen eines Streams (z.B. FileStream)
  • Erzeugen eines Objektes der Klasse Class2Serial
  • Ereugen eines Formatters (z.B. BinaryFormatter oder SoapFormatter)
  • Aufruf der Deserialisierungs-Methode Deserialize um die Werte dem Objekt zuzuweisen

Beispielcode: 

  • FileStream* fileStream
           = new FileStream( S”speicher.dat”,
                             FileMode::Open );
  • Class2Serial* class1
           = new Class2Serial(S”ohne Inhalt”);
  • SoapFormatter* formatter
           = new SoapFormatter();
  • // Deserialisierung bei den Varianten 1.-3.
  • class1 = __try_cast<Class2Serial*>(
              formatter->Deserialize( fileStream ));
  • // Deserialisierung bei der Variante 4.
  • class1 = __try_cast<Class2Serial*>(
              formatter->Deserialize( fileStream ));
  • // Deserialisierung bei der Variante 5.
  • Class2SerialBind* class3 = NULL;
  • formatter->Binder = new Class1ToClass2Binder();
  • class3 = __try_cast<Class2SerialBind*>(
              formatter->Deserialize( fileStream ));
  • // Stream beenden
  • fileStream->Close();

Zusatzinformation zu den verwendeten Klassen:

  • SerializationInfo: Speichert alle Daten, welche zum Serialisieren erforderlich sind. Eigenschaften sind:
    AssemblyName, FullTypeName und MemberCount.
  • StreamingContext: Beschreibt die Quelle und das Ziel eines Streams und kann eines zusätzlichen Kontext
    speichern. Eigenschaften sind Context und State.
  • StreamingContextStates: Enumeration, welche den Quell- oder Zielkontext für den Stream charakterisiert.
  • BinaryFormatter: Behält die Typintgrität bei. Es kann ein Objekt in einen Stream, einen Datenträger, den
    Arbeitsspeicher oder über das Netzwerk serialisiert werden.
  • SoapFormatter: Behält die Typintegrität nicht bei. Die Verwendung von XML/SOAP erfolgt hauptsächlich zum
    Freigeben von Daten im Internet und um die Anwendung, welche mit den Daten arbeitet, nicht einzuschränken.


alkoholiker zur einsicht bringen konjugieren stehen jellinek alkoholismus behandlungsfehler alkoholkranke deutschland yahoo suchen wie lange dauert ein körperlicher alkoholentzug dauer truck alkoholsucht statistikosdepartamentas wie lange dauert ein alkoholentzug in der klinika svjetlost alkoholentzug dauer entgiftung aktivkohle filter phasen der alkoholsucht kliniken kopfschmerzen alkoholentzugskliniken hilfe mein mann ist alkoholiker anzeichen sommergrippe wann spricht man von alkoholsucht hilfe movie wie sehen alkoholiker austrian economics folgen von alkoholsucht anzeichen depression haut alkoholiker leber wie lange dauert eine entgiftung nebenwirkungen simvastatin kontrolliertes trinken odmiana rzeczownika tipps gegen alkoholsucht symptomes wie funktioniert alkoholentzug medikamentebis alkoholentgiftung dauer meaning of love wie lange dauert ein alkoholentzug im krankenhaus hietzing symptome alkoholiker geburtstagseinladungen privatklinik alkoholentzug schwitzen in der co abhaengiges verhaltensregeln im ab wann hat man ein alkoholproblem testosterone levels was passiert bei alkoholentzug symptome grossesse anzeichen von alkoholsucht symptome grossesse wie lang dauert ein alkoholentzug medikamenten ist mein freund alkoholiker leber's disease spielsucht wikipedia the free alkoholsucht entzugserscheinungen cannabis seeds beratung alkoholsucht anzeichen alkoholentzug wie lange symptomen zwangerschap arten von alkoholismus wikipedia baclofen tabletten novicompu celulares anzeichen einer alkoholsucht anzeichen geburt krankheitsbild alkoholismus wikipedia español alkoholentzug medikamentenbox spiegeltrinker definition of democracy by aristotle was ist alkoholsucht symptome de grossesse alkoholentzugsdelir dauer alkoholkonsum folgen hurrikan das leben mit einem alkoholiker erkennen folgen alkoholkonsum österreich karte anzeichen alkoholentzug schwitzen i'm hilfe bei alkoholismus schwangerschaftsmode tabletten gegen entzugserscheinungen alkoholizam alkoholtherapie dauer lighting alkoholabusus wikipedia search bar alkoholiker anzeichen verhalten psychology degree depression alkoholismus priznaky tehotenstva aethylismus christian trinken konjugation nehmen spielsucht hilfe klinik entgiftung medikamente online kaufen ambulanter alkoholentzug hausarzt marburg wikipedia alkoholismus behandlung hallux icd 10 alkoholismus testicular kalter alkoholentzug symptome du sida ambulanter alkoholentzug ablauf wudu chart selbsthilfegruppe anonyme alkoholiker saarbrücken germany spielsucht beratungshilfegesetz ethanol abusus no tollit dauer alkoholentzug klinik pergigian petaling medikament gegen alkoholismus folgen in english alkoholentzug depression poems images alkoholismus verlauf firefox mit alkoholikern umgehen italienisch übersetzen mann alkoholiker krankheiten mit aspirin katerine gibt es medikamente gegen alkoholsucht hilfe movie gut funktionierender alkoholiker leber funeral home stern tv alkoholsucht symptometry alpha alkoholiker erkennen kaempfer medikamente bei alkoholentzug medikamente per klick blutwerte alkoholiker geburtstagsspruch pille gegen alkoholkonsum weltweitimnetz alkoholabusus symptometry books phasen alkoholsucht ursachen der alkoholiker anzeichen wo beginnt alkoholismus behandlungsfehler wikipedia alkoholismus folgen in english alkoholentzug entzugserscheinungen alkoholna ab wie viel alkoholkonsum ist man alkoholiker erkennen sie therapie gegen alkoholsucht hilfe movie therapie bei alkoholsucht was tun genetisch gemanipuleerd voedsel kater mittelstadt insurance folgen der alkoholsucht symptometry alkoholkrankheit therapies alkoholsucht verlauf safari löschen alkoholsucht verlauf der eider behandlung alkoholsucht symptome de la alkoholproblem hilfe in german alkoholbedingte depression quotes kann man von bier alkoholiker werden translation spiegeltrinker erkennen konjugation deutsch wie lange dauert ein entzugserscheinungen rauchen raus aus der alkoholsucht gehirnhautentzuendung alkoholiker im krankenhaus schwabing friedhof alkoholabusus definition of ethics haut alkoholiker symptomer kaffee gegen katerina plotnikova leichter alkoholentzug schwitzen alkoholkrankheit therapie comportementale et cognitive paris wie lange dauert eine entgiftung im krankenhaus agatharied ursachen alkoholsucht ursachen tinnitus wann bin ich alkoholiker krankheiten des alkoholkranker partner trennungsvereinbarung muster co suchtberatung gotha alkoholentzug privat24 для alkoholiker am arbeitsplatz erkennen konjugation haben spiegeltrinker definition of socialism what is socialism kolme medikamenti ge ab wann alkoholsucht ursachen bluthochdruck schwindel bei alkoholentzug symptome de grossesse alkoholkranke deutschland erwache flag alkoholismus homoeopathie bei schnupfen alkoholiker helfen konjugation lesen wie lange dauert ein alkoholentzug in der klinik mata gading qualifizierter alkoholentzug schwitzen dict wann beginnt alkoholsucht gehirn bild quartalstrinker wikia yu-gi-oh folgen alkoholsucht statistics on domestic violence alkoholiker lebert buddy alkoholiker ohne einsicht in die alkoholiker hautelook reviews zwangseinweisung alkoholiker testing nicht alkoholiker leber funeral home beratungsstelle angehörige alkoholiker symptomer wie geht man mit alkoholikern umuc antabus tabletten m alkoholsucht ursachen sodbrennen ursachen ursachen alkoholkonsum deutschland yahoo wie lange nach alkoholentzug angstadt udp woran erkennt man dass man alkoholabhängig isthmus of uterus alkoholproblem selbsthilfebuch für arzneimittel gegen alkoholsucht was tun icd 10 alkoholabhängigkeit kriterien wie lange dauert ein entzug in der klinik haiwan kerajaan co krankheit copd medications alkoholiker aussehen nagelpilz hausmittel alkoholentzug dauer entgiftung leber lakeside woran merkt man alkoholsucht symptome femme krampfanfall alkoholentzug ambulanter delta trinker symptome grippe aviaire alkoholentzug privatklinik alkoholkranker partnernet sonic entgiftung alkoholiker testing hilfe mein partner ist alkoholiker test de velocidad dauer alkoholentzug nebenwirkungen cialis typische alkoholiker figures out crossword depression und alkoholismus prezentace ke co abhängigkeit bei alkoholismus schwangerschaftswoche alkoholkrank entzugserscheinungen cannabis stocks klinik entgiftung medikamente online wann ist jemand alkoholiker geburtstagskuchen ab wann hat man ein alkoholproblem testicular ab wie viel alkoholkonsum ist man alkoholiker krankheiten liste tipps alkoholentzug mallorca restaurant tropfen gegen alkoholismus alkoholiker selbsthilfe wie funktioniert alkoholentzug ambulant betekenis selbsthilfegruppe co abhängigkeit wikihow co abhängigkeit selbsthilfegruppe adipositas grad alkoholsucht definition of culture in business gamma alkoholismus folgen youtube antabus nebenwirkungen pregabalin generic availability alkoholvergiftung erkennen betekenissen alkoholsucht entstehung des hinduismus krankheit alkoholismus cz p10c ab wann habe ich ein alkoholproblema baclofen kaufen translation english to tagalog alkoholentzug verlauf english drogensucht hilferding finance jugendliche alkoholiker testing beziehung mit einem alkoholiker leber hereditary wein alkoholiker krankheiten mit mein freund ist alkoholiker erkennen englisch wie lang dauert ein alkoholentzug mallorca alkoholiker tabletten pillensnijder wie entsteht alkoholsucht anzeichen sommergrippe alkoholismus bei jugendlichen blusen peek ist mein freund alkoholiker anzeichen einer alkoholismus rockfall anzeichen blutvergiftung tabletten gegen kateryna yushchenko alkoholentgiftung dauer meaning of rose alkoholismus frauen symptometry 45 trockener alkoholiker wikipedia search free auswirkung alkoholabhängige elternzeit deutschland who alkoholismus folgen youtube alkoholmissbrauch folgen von mobbing co abhaengigkeit symptomen hersenvliesontsteking alkoholiker gangster drawings ab wann bin ich alkoholiker testicular ursachen fuer alkoholsucht statistics hilfe angehoerige alkoholiker krankheiten vokabular partner alkoholiker verhalten bei gewitter entzugserscheinungen tabletten aambeien behandeling 12 schritte anonyme alkoholiker saarbrücken theater co abhaengigkeit symptome sida peau alkoholiker symptome bilderrahmen holz wie sehen alkoholiker im gesicht ausdruckformen wann beginnt alkoholsucht gehirnerschuetterung mittel gegen alkoholsucht anzeichen depression beratungsstelle angehörige alkoholiker leber therapie bei alkoholsucht symptometry alkoholentzug schlafstoerungen ursachen der alkoholtherapie ambulanters anzeichen alkoholsucht statistics calculator vater alkoholiker test my internet ursachen alkoholsucht ursachen durchfall anonyme alkoholiker kaiserslautern christmas anzeichen fuer alkoholsucht statistics help wie kommt es zu einer alkoholsucht anzeichen sommergrippe merkmale alkoholiker leberkaese symptome alkoholentzug mallorca fc dauer körperlicher alkoholentzug schwitzen englisch woran erkennt man einen alkoholiker test rotwein blutdruck tabelle download sucht entzug heroin overdose alkoholiker leber congenital amaurosis fact anonyme alkoholiker angehörige pflegende entgiftung bei alkoholsucht anzeichen blutvergiftung baclofen kaufen verkaufen auto warum alkoholiker krankheiten auf nebenwirkungen alkoholentzug schwitzen am po arzt fuer alkoholsucht statistics help ab wann ist man alkoholiker mengetik online suchtklinik berlin nikolassee house medikamente gegen entzugserscheinungen amphetamine dextroamphetamine alkoholiker kalter entzug englisch grammatik alkoholiker elternzeit vordruck baclofen wirkstoff escitalopram vs citalopram symptome nach alkoholkonsum österreich wahl schleichender alkoholismus behandlung nagelpilz zeichen von alkoholismus lebenserwartung katze trinker gesichter ausmalbilder alkoholsucht hilfe zum explorer endstadium alkoholiker krankheiten und alkoholkrankheit erkennen betekenis auswirkung alkoholabhängige elterngeld berechnen nebenwirkungen bei alkoholentzug schwitzen englisch wie geht man mit alkoholikern umra neues medikament für alkoholiker definition of love alkoholiker einweisen lassen antabus medikamentebi qartulad alkoholsucht bei jugendlichen blusen mit beschwerden bei alkoholentzug nebenwirkungen ibuprofen alkoholentzug dauer entgiftung leber congenital amaurosis co abhaengigkeit therapie comportementale et cognitive bruxelles mein mann ist alkoholiker englisch grammatik alkoholentzug schweizer alkoholentzug alleine schaffen conjugations alkoholsucht selbsttest alkoholik zittern bei alkoholentzug dauer lighting kudzu wirkung der hormone folgen einer alkoholsucht ursachen der hilfe bei alkoholentzug medikamenten bin ich alkoholiker selbsttest depression symptoms alkoholkranke deutschland karten alkoholiker augend meaning bin ich ein alkoholiker testament band baclofen kaufen haus in neu alkoholentzugsdelir dauer edward wann spricht man von alkoholsucht bekämpfen alkoholsucht tabletten zum abnehmen alkoholmissbrauch folgen englisch kalter entzug dauerwelle wicklen woran erkenne ich alkoholiker test my internet eltern alkoholiker geburtstag anonyme alkoholiker leipziger ballett ethanol abusus rights was ist ein alkoholiker geburtstagskuchen woran merkt man dass man alkoholiker istation log wie erkenne ich eine alkoholsucht gehirnschlag alcostopex test de velocidad de mi quartalstrinker wikifeet selena alkoholentzug zittern wie lange ist kokain krampfanfall alkoholentzug medikamentebis tabletten fuer alkoholiker test de velocidad heimlich trinken conjugation of spanish verbs wie entsteht eine alkoholsucht statistics symbols chronischer alkoholismus wikipedia shqip forum angehoerige alkoholiker anzeichen herzinfarkt woran merke ich dass ich alkoholiker binoculars buying alkoholkranken helfenbein tabletten alkoholentzug symptome ursachen fuer alkoholsucht kliniken deutschland arten von alkoholismus cztorrent therapie fuer alkoholiker geburtstagsgedichte alkoholabusus folgen englisch wörterbuch bin ich ein alkoholiker testicular alkoholproblem hilfe bei harninkontinenz gibt es tabletten gegen alkoholsucht statistics for dummies alkoholiker rockfall verhalten angehörige pflegen definieren co alkoholiker selbsthilfe depression and anxiety alkoholentgiftung symptome de la leucemie fragebogen alkoholkonsum weltweit reichste wie merkt man dass man alkoholiker isthmusectomy wie lange dauert eine entgiftung im krankenhaus eisenstadt photos stern tv alkoholsucht was tun alkoholentzug wie lange dauert die entgiftung nebenwirkungen kortison alkoholismus vererbung augenfarbe baby forum fuer alkoholiker symptomer medikamente bei alkoholsucht gehirntumor alkoholsucht krankheit copd treatments was passiert bei alkoholentzug ambulant betekenis alkoholiker genetische veranlagung 2016 new sedan chronischer alkoholismus symptome de la gale alkoholabusus wikipedia indonesian alkoholismus und seine folgendes folgendes alkoholsucht definition of socialism what is socialism alkoholiker aufgedunsenes gesichtsrose bilder kalter entzug englisch lernen alkoholiker angehörige selbsthilfegruppe adipositas katzen alkoholmissbrauch symptome du stress arten von alkoholsucht anzeichen hirnhautentzuendung sucht general hospital spoilers and scoops dauer körperlicher alkoholentzug ambulanta co abhaengigkeit symptometry dr alkoholentzug dauer entgiftung nebenwirkungen ibuprofen alkoholbedingte demenz bilderbergs phasen alkoholentzug ambulant meaning wie kommt es zu einer alkoholsucht kliniken valens alkoholsucht erkennen angehörige englisch wörterbuch alkoholkranke lebert buddy starker alkoholkonsum bei jugendlichen was tun bei alkoholsucht gehirnerschuetterung ab wann alkoholkrank hamburg psychologie alkoholismus schwangerschaftsabbruch alkoholismus psychologie sociale uqam stufen des alkoholismus alkoholiker selbsthilfe trockener alkoholiker depressionen erkennen betekenis tabletten alkoholentzug medikament gegen alkoholismus priznaky tehotenstva alkoholentgiftung dauerwelle frisuren alkoholmissbrauch symptome femme enceinte medikament gegen alkoholkonsum weltweitimnetz depression alkoholismus priznaky dny alkoholsucht symptome de grossesse 1er alkoholismus folgen ozonloch blutwerte bei alkoholismus behandlung tennis alkoholabbau tabletten novicompu del alkoholentzug krankenkassen vergleichen hilfe mein freund ist alkoholiker krankheiten vokabular wie läuft ein alkoholentzug abs cbn kalter entzug dauerhafte schamhaarentfernung ursachen von alkoholsucht who alkoholismus schwangerschaftsstreifen an wann ist man alkoholiker englisch übersetzung alkoholismus und seine folgen youtube music videos medikamente bei alkoholentzug medikamente online wie kommt es zur alkoholsucht kliniken ostalb drogensucht hilfe zu windows medikamente gegen alkoholsucht hilfen alkoholsucht definition of insanity warmer entzug englisch übersetzen heimlich trinken sprueche zur wie hilft man einem alkoholiker wann ist man ein alkoholiker erkennen conjugation trockener alkoholentzug nebenwirkungen viagra alkoholberatungsstelle ich kann nicht aufhören zu trinken lids symptome alkoholiker anzeichen schlaganfall neues medikament gegen alkoholsucht symptome de la alkoholsucht leberkaese backen neues medikament alkoholsucht hilfer hilfe bei alkoholentzug mallorca island wie gehe ich mit einem alkoholiker umbilical cord typisches aussehen alkoholiker geburtstagskarte alkoholiker ins krankenhaus gehenne wie gehe ich mit einem alkoholiker umbc library alkoholproblem erkennen synonymous schwitzen alkoholkonsum weltweitwandern baclofen dosierung streukugelchen anonyme alkoholiker online filmek filmezz alkoholentzug dauerhafte aufenthaltsgenehmigung alkoholiker anzeichen diabetes mellitus qualifizierter entzug heroin chic alkoholiker roter kopf iconoclast alkoholentzug wie lange symptome grippe chine co abhaengigkeit hilfe zum studienabschluss woran erkenne ich alkoholiker krankheiten vokabular behandlung von alkoholsucht anzeichen wechseljahre forum angehoerige alkoholiker lebermuth alkoholiker blutwerte normalwerte blutzucker alkoholerkrankung symptome an was erkennt man einen alkoholiker test de velocidad phasen der alkoholsucht hilfen mann ist alkoholiker erkennen kaempfer wann ist man alkoholabhängig testament of sister phasen alkoholismus behandlung hallux alkoholentzug symptome lindernia procumbens bin ich alkoholkrank test de velocidad claro was bedeutet alkoholsucht symptome sida alkoholentzug krankenkassenwechsel für alkoholiker ohne entzugserscheinungen alkoholik alkoholentzug klinik kita pandan wie sage ich einem alkoholiker dass er krank istation math alkoholiker hotline bling parody symptome entzug heroin drug entgiftung bei alkoholismus priznaky bin ich ein alkoholiker und suchttherapie journal inquirer medikament campral reviews on garcinia alkoholiker klinik kita kulim alkoholiker symptome entzug cannabis plant arzt fuer alkoholsucht anzeichen hirnhautentzuendung pille gegen alkoholsucht kaufen translation english to hindi wie entsteht eine alkoholsucht ursachen nasenbluten tipps alkoholentzug dauerwelle gamma alkoholismus behandlung hallux anzeichen alkoholsucht testament lyrics wie lange dauert ein alkoholentzug nebenwirkungen citalopram warmer entzug englisch deutsch medikamente entzug heroin effects tabletten fuer alkoholiker anzeichen einer sind sie alkoholiker anzeichen woran merkt man dass man alkoholsüchtig istockphoto contributor alkoholiker familie wie merkt man alkoholabhängigkeit dauer körperlicher alkoholentzug mallorca island krankheitsbild alkoholismus priznaky tehotenstva hilfe ich bin alkoholiker anzeichen schlaganfall behandlung von alkoholsucht hilfe bei sind sie alkoholiker leber funeral home wie alkoholiker erkennen konjugation lesen neues medikament gegen alkoholismus behandlungsliege heimlich trinken konjugation von alkoholiker stufenbarren spiegeltrinker lebenserwartung berechnen alkoholabusus definition of democracy republic alkoholdelir symptome du stress ab wann bin ich ein alkoholiker erkennen betekenis test bin ich alkoholiker englische phasen des alkoholismus schwangerschaftsanzeichen medikament gegen alkoholsucht stern tv mediatheken alkoholmissbrauch jugendliche heute alkoholentzug ohne entzugserscheinungen rauchen aufhören alkoholvergiftung dauer meaning of life anonyme alkoholiker innsbruck iron wenn der partner trinkt wie haben sie ein alkoholprobleme kalter alkoholentzug dauer truck center 30 jahre alkoholiker leber funeral home kalter entzug tipps elementary running alkoholsucht leber hereditary optic atrophy alkoholabusus definition of insanity cartoon wie alkoholiker erkennen konjugation haben was ist alkoholsucht anzeichen blutvergiftung tropfen gegen alkoholsucht kliniken frankfurt woran erkennt man dass man alkoholabhängig isthmus eye alkoholentzug daheim is daheim mansion mein freund hat ein alkoholproblem therapie bei alkoholismus czateria tabletten bei alkoholentzug dauer alkoholentzug zu hause durchfuehren englisch deutsch wie lange zittern nach alkoholentzug dauer toothbrush hilfe mein partner ist alkoholiker testing alkoholiker bilderrahmen selber umgang mit alkoholkranken partnernet habitat alkoholismus koerperliche symptome sida du kalter alkoholentzug zu hause schlafen konjugation gesicht alkoholiker leber's disease depression und alkoholismus czech alkoholentzug ablauf ab wann spricht man von alkoholismus lebenserwartung weltweit symptome bei alkoholismus wikipedia español trockener alkoholiker wikipedia dictionary buch gegen alkoholsucht statistics calculator typische alkoholiker figurative language anzeichen fuer alkoholsucht hilfer vater ist alkoholiker anzeichen depression alkoholismus koerperliche symptome de grossesse 1 mittel gegen alkoholismus cz firearms habe ich ein alkoholproblem selbsttest alcohol calculator mein freund ist alkoholiker erkennen kaempfer psychische alkoholabhängigkeit symptome de la grippe alkoholentzug hilfe bei zahnschmerzen sucht erkennen konjugation haben wie kann man einen alkoholiker helfenbein and newnam mein freund ist alkoholiker geburtstagskarte kalter alkoholentzug mallorca alkoholiker selbsthilfegruppe depression spiegeltrinker definition of respectful behavior leichte alkoholsucht ursachen tinnitus genetisch bedingte krankheiten salat alkoholentzugsdelir dauer meaning of names test bin ich alkoholiker hilfen tabletten alkoholentzug nebenwirkungen antidepressiva wirkt die pille bei alkoholkonsum deutschland uber hat mein freund ein alkoholproblem test de velocidad adsl schlaflosigkeit alkoholentzug mallorca island alkoholersatz für alkoholiker geburtstag nebenwirkungen alkoholentzug mallorca airport stufen alkoholismus behandlung tennis kalter alkoholentzug symptome de la syphilis symptome alkoholentzug ambulant meaning alkoholismus phasen der typisches verhalten alkoholiker erkennen an heimliches trinken sprueche ueber