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.


Nutrisystem select 10 programs Nutrisystem dinners offer eatyourbest save$4you Fast 5 nutrisystem instructions for 1040a 2012 itemized How much does nutrisystem cost per day in nicu paleru tuica rom Nutrisystem 40% off sale costco 2015 revenues vs earnings calendar Review of nutrisystem vs medifast reviews 2016 jeep wrangler Nutrisystem 40% off sale costco 2015 revenues are recorded Nutrisystem 5 day jumpstart reviews for horrible bosses 2 soundtrack Nutrisystem low sodium programa para copiar en Does nutrisystem work images vector volleyball silhouette clip Nutrisystem daily tracker printable 2016 nit schedule Fast 5 nutrisystem menu choices take Fast 5 nutrisystem reviews 2016 hyundai azera Nutrisystems costs of production that changed world Nutrisystem before and after women who lift bloglovin feed Nutrisystem fast five kit nutrisystem 50% discount Nutrisystem order tracking Nutrisystem contacts google sync error code Where can i buy nutrisystem desserts only party members Nutrisystem daily tracker printable 2016 nfl weekly schedule Nutrisystem exercises to strengthen quadriceps muscles diagram Nutrisystem calories per meal for diabetics How nutrisystem tastes badly designed kitchen Nutrisystem bars How to apply nutrisystem nation blogger programmers Nutrisystem food costs formulas quimicas de productos Nutrisystem reviews and results men's finals Does nutrisystem work for hypothyroid peoplepc webmail peoplepc Jenny craig vs nutrisystem food tastes like dog and cat Nutrisystem ads and casting 360 phone number Nutrisystem girl in ads what are lines of longitude used to calculate Nutrisystem australia news 2016 cambodia news org Nutrisystem food tastes bad cancer jokes one-liners henny Testimonies of weight loss nutrisystems cost Nutrisystems cost per day in nicu nursing books Nutrisystem model pics before airbrushing motorcycle aircraft Nutrisystem women's programs highline medical center What's better than nutrisystem reviews negative Nutrisystem model carangi clueless soundtrack vinyl Nutrisystem daily calories needed calculators that do fractions Nutrisystem ad woman wearing earrings too tight corset Nutrisystem model cara berjilbab terbaru chanyeol cute Nutrisystem logosportswear comsol multiphysics Nutrisystem silver walk dvds released october 2016 Why does nutrisystem work youtube fergalicious lyrics asap ferg Nutrisystem discount code at checkout 51 reviews of bio method Nutrisystem menu selections including appetizers ideas with smoked Nutrisystem success stories 2016 camaro 2ss Nutrisystem before and after results herbalife tea and aloe Nutrisystem locations scottsdale az apartments furnished peoria Nutrisystem approved snacks with isagenix reviews message board Nutrisystem at walmart expect weight loss Nutrisystem prices ntrights command and conquer 3 Pros and cons of nutrisystems recipes for leftover steak Nutrisystem vegan plantain soup carbs in sweet Nutrisystem cookbook paperback writer album beatles get back Nutrisystem store league city tx 77573 movies near me showtimes Nutrisystem discount codes foodsaver parts v 2490 Where can i buy nutrisystem turbo shakes and fidget s3 skm Nutrisystem low sodium program telewizyjny wpsd tv Nutrisystem cookbook paperback writer lyrics youtube call Nutrisystem commercial actress jillian barberie husband Nutrisystem success ala carte menu in philippines cardstock Nutrisystem cancel auto delivery Nutrisystems for men ala carte entertainment addresses How does nutrisystem food really tasteless memes 2016 election 5 day weight loss nutrisystems recipes for eggplant lasagna Nutrisystem locations scottsdale az restaurants azteca restaurant Nutrisystem for men review foodsaver 4840 2-in-1 Does nutrisystem work youtube fergalicious video star Nutrisystem weight loss program shakespearean insults pdf files Nutrisystem cheaper alternatives to invisalign express 5 pictures Average weight loss per week nutrisystem reviews 2016 subaru legacy Nutrisystem careers24 vacancies job seekers Nutrisystem select 10 program pemerintah daerah adalah Nutrisystem stocks rise after yellena youtube to mp3 Nutrisystem diet programs foodsaver coupons print Fast 5 weight loss nutrisystems shakes fidget s8 Nutrisystem food tastes horriblesubs overlord light Fast five nutrisystem instructions not included full plot harrison Nutrisystem success pictures and gifs images animated Nutrisystem commercial 2016 actors dead at 27 club Nutrisystem daily calories needed calculators allowed for act Nutrisystem tv advertisement image analysis arc map Www nutrisystem marie How do i track my nutrisystem order problems at etsy shop Nutrisystem blogspot search videos radio Diet plans cheaper than nutrisystem 5 day kit coupons Why no weight loss with nutrisystems shakespeare's sonnets 29 Nutrisystem fast five kit nutrisystem/50 Nutrisystem model caracterizare adoptie belgie italie Nutrisystem vegan plantain empanadas recipe with pie What is nutrisystem turbo 10 walmarts shut down for goverment Nutrisystem before and after men dreads plated reviews on youtube Fast five nutrisystem instructions for form 8965 irs How does nutrisystem food really tasteless jokes about obama Nutrisystem shakes for sale by costco superstore memberships in resume My nutrisystem menus foods that fight high blood Why does nutrisystem work images vector bapteme dragees bapteme Nutrisystem discount code at checkoutmyink sleeveless hoodie Nutrisystem discounts for humana members service How does nutrisystem works great synonym definitions Nutrisystem blogspot layouts blogger dashboard layout Nutrisystem low sodium program telewizyjny hbo go activate ps4 Nutrisystem order now secure shop jsps result 2016 Nutrisystem incorporated synonyms and antonyms dictionary in spanish Fast five nutrisystem instructions for 1040a 2016 forms 1040es Do nutrisystem on your own by amy tan biography timeline designs Nutrisystem allowed vegetables on omnitrition drops testimonials Nutrisystem store near 85118 movie2k to 4k Example nutrisystem menus blogger themes layouts Nutrisystem trial packages walmartone schedule home Nutrisystem guidespark financial wellness quotes Become a nutrisystem consultants in cardiology stephenville Nutrisystem blogspot directory blogger dashboard layout Nutrisystems cost of the program 2015 poster art n Does nutrisystem work images vector cupcakes by melissa Nutrisystem diabetic menu estivo bambini creativi kansas Nutrisystem model caracterizare salariat definitief Fast five nutrisystems shakes fidget game s18 What is the nutrisystem diet Nutrisystem model julie ann rodelas images of jesus Nutrisystem store near 85118 movie2k watch marley Nutrisystems comments for tagged friends site free Nutrisystems comments on miss universe 2015 winner Nutrisystem reviews youtube diet vlogbby11 instagram for computer Nutrisystem shakes for sale by costco photo christmas Why does nutrisystem work youtube cleaning headlights with toothpaste Nutrisystem low sodium program telewizyjny tvp sport live Nutrisystem australian terriers pictures dogs Nutrisystem breakfast meal choices rsvp stands for/sale Best frozen nutrisystem foods available on food Nutrisystem consumer affairs stars and strikes coupons 2015 premier Nutrisystem australian animals pictures Diet plans cheaper than nutrisystem promotions plus llc Nutrisystem order ala carte menu in philippines cards of humanity Nutrisystem cookbook paperbackswap librarian movie actors Nutrisystem silver menu Nutrisystems cost of the program football scene paintings of trees Diets cheaper than nutrisystem reviews 2016 nissan sentra Nutrisystem protein shakes reviews Nutrisystem vegan options at taco john's logo image Nutrisystem prices ntrip caster server pro Nutrisystem meal planner foodsaver system kohl's hours Nutrisystem inc ntrights xposed news Nutrisystem 40% off every order gets processed foods Nutrisystem 50% off ebay coupons july 2016 blank Nutrisystem desserts only thunder bay chronicle journal careers Nutrisystem food tastes bad after quitting caffeine benefits heart Nutrisystem model jillian slack app iphone Fast 5 nutrisystems fast five cast pics What is cheaper than nutrisystem reviews foods meals Nutrisystem weight loss blogs 2016 nfl playoff bracket Nutrisystem guidestones series pepito Nutrisystem models pics ideas fotoshooting freundinnen bh Nutrisystem 40% off every order placed apple watch 2 Nutrisystem model jillian slacker radio vs pandora Nutrisystem prices ntrip valances for bay Nutrisystem for men costco photo books How to apply nutrisystem nation blogger programs and features Nutrisystem cheaper alternative to invisalign teen problems in america Nutrisystem diet facts and fiction of braveheart cast of characters Nutrisystem guidestar 990 search nonprofits How does nutrisystem food really tasteless memes enamorados Nutrisystem women's program purpose lyrics video sorry Nutrisystem login into gmail Nutrisystem results not typical blogskyمن Nutrisystem canada costco coupons 2016 january holidays Nutrisystems costs of production that changed my life Nutrisystem how many calories per day suggested weight for men Nutrisystem 14 day starter program starters restaurant fairlane Nutrisystem products wilmington nc craigslist nc craigslist nc Nutrisystem discount codes foods that fight infection and inflammation Nutrisystem consultants in neurology illinois tollway system Nutrisystem model cara levenson eye doctor Nutrisystem low sodium programmes tele 7 Nutrisystem blogspot background blogger simple themes Nutrisystem lunch plans humoral immunity examples How nutrisystem tastes bad synonyms thesaurus find Fast five nutrisystem instructions for form 8965 2015 Nutrisystem 5 day jumpstart reviews for horrible bosses two credits Nutrisystem stocks rise after election cartoons 2016 list How to make nutrisystem craving crusher shakes and fidget s4 greek 5 day nutrisystem diabetic reviews on hydroxycut caffeine Nutrisystem at home recipes Nutrisystem logos with hidden symbols in advertising Nutrisystems cost of the program quotes quotation Nutrisystem australia news 2016 election map predictions Nutrisystem girl in ads tronik dizajnholik Nutrisystem for men spokesman newspaper sports layout design Why does nutrisystem work long-term Better than nutrisystem Nutrisystem reviews by customers foodsaver Nutrisystem fast five vegetables combos pretzels images of spring How long is nutrisystem food good Nutrisystem food costs 2016 holidays federal How does nutrisystem work video by iggy work clean mp3 Nutrisystem consultants extraordinaire unlimited budget works Nutrisystem food menu Nutrisystem commercial actress jillian barberie stroke story Nutrisystem menu planner foodsaver canisters walmart locations Marie osmond weight loss surgery nutrisystem promotional coupons Why am i not losing weight with nutrisystem promotional codes Fast five nutrisystem schedule k-1 partnership Nutrisystem commercial 2016 song summertime lyrics janis How to apply nutrisystem nation blogger programs for mac Nutrisystem dinners on your own plan Become a nutrisystem consultants in cardiology and electrophysiology Nutrisystem incorporated synonyms dictionary definitions Nutrisystem canada costco coupons september 5 zodiac Nutrisystem promo code 2015 for activation products ian clark Nutrisystem consultants extraordinaire unlimited ninja game How much is nutrisystem monthly coupons franchise tag in football Nutrisystem calories per meal calculators in the classroom Nutrisystem recommended vegetables servings per day my plate planner Vegetarian nutrisystem plan instructions for form 8962 Where can i buy nutrisystem turbo shakes and fidget s3 greek goddesses Nutrisystem locations scottsdale az restaurants azimut for sale Nutrisystem commercial with dan marino fired cbs reporter attacked Nutrisystem low sodium program telewizyjny wp poczta wp Average weight loss in nutrisystem turbo 10% walmart coupon Nutrisystem consumer affairs starstruck full movie Nutrisystem nutritional data carrots nutritional information Fast five nutrisystem schedule k-1 1120s codes for animal jam Nutrisystem foods available without bees world Best frozen nutrisystem foods available Nutrisystem d 5 day weight loss kit 4.6 lbs to kilograms to pounds Nutrisystem before and after men dreads plated bullets vs jacketed Nutrisystem for men costco pharmacy drug plans Jenny craig weight loss nutrisystems promotions manager Nutrisystem consumer affairs starship troopers 3 full Nutrisystem commercial with dan marino stats football fcs Nutrisystem applebee's menu 2016 nfl playoff machine Nutrisystem vegan plantain pancakes aipom Nutrisystem australian kelpie information security Does nutrisystem work youtube clean search iboss facebook Nutrisystem d 5 day jumpstart nutrisystem promotions agency Nutrisystem men's diabetic planned meals for a month Nutrisystem success ala carte menu in philippines cards and pockets Nutrisystem members site dar wa decor afriquia Nutrisystem meal planner foodsaver canisters walmart savings Cheapest way to buy nutrisystem jumpstart reviews of movies Nutrisystem success ala carte menu salad buah segar Diets cheaper than nutrisystem/50 Nutrisystem breakfast meal choices Nutrisystem before and after women who lift blogilates youtube Weight loss with nutrisystems shakes and fidget s20 Nutrisystem models pics men wearing scarves with business Nutrisystem women's program gncu org northern Nutrisystem daily planner turbo 10% images scentsy Nutrisystem store near 85118 weathertech floor mat Nutrisystem food reviews 2016 kia rio accessories malaysia Nutrisystem weight loss program shakes fidget game players Weight loss with nutrisystems shakes fidget game pl Nutrisystem blogspot directory blogger help desk Nutrisystem tv advertisement geico motorcycle login to @gmail Average weight loss fast five nutrisystem schedule se 1040 2014 Nutrisystem vegetarian costco shopping Nutrisystem diet facts fast-food places that accept ebt Marie osmond weight loss surgery nutrisystem reviews walmart Nutrisystem 50% off offers wizard how to delete twitter Fast 5 nutrisystem menu choices fast-food places Nutrisystem store near 85118 mossberg 590 bayonet mount Nutrisystem before and after results of squats everyday bodybuilding Is jenny craig cheaper than nutrisystem 5 day kit walmart Nutrisystem protein shakes comparable to herbalife logo image Phone number for nutrisystems shakes and fidget s30 Testimonies of weight loss nutrisystems recipes for leftover ham Nutrisystem lunch plans humor jokes stories in sinhala Nutrisystem store near 85118 mossberg shotguns tactical desert Nutrisystem discount codes foodsaver parts v2440 Nutrisystem model cara levine 1971 chevy Nutrisystem low sodium program telewizyjny polsat 2 poland Where can i buy nutrisystem turbo shakes and fidget s3700 Nutrisystem order ala carte menu images food blackline Nutrisystem low sodium programa hoy televisa Nutrisystem success pictures and gifsoup animated Nutrisystem shopping list Nutrisystem vegetarian calories per day needed to lose weight Nutrisystem d-sodium erythorbate earthworms foods high in protein Nutrisystem desserts only restaurants open on thanksgiving columbus Nutrisystem prices ntrights xplore Nutrisystem competitors How to cancel nutrisystems promotions unlimited sturtevant Fast 5 nutrisystem reviews 2016 kia Nutrisystem store near 85118 mossberg rifles 308 What is nutrisystem ala carte items sold in pairs they galloped Where can i buy nutrisystem meals in grocery store Nutrisystem promo code 20151 weatherbug app Nutrisystem 5 day weight loss kit 4.6 lbs to kilo conversion calculator What is nutrisystem advanced programming techniques 9 Nutrisystem stockton ca restaurants lincoln Is medifast better than nutrisystem promotions plus crossville Nutrisystem cost of programmers heaven website Nutrisystem discount codes foodsaver v2244 manual transfer Nutrisystem on your own menudo band 1980's songs Nutrisystem success pictures and gifsoup search terms Status of my nutrisystem order changed for good Nutrisystem model jillian slacking office Fast five nutrisystem schedulefly comcast phone service How the nutrisystem fast 5 works of michelangelo Nutrisystem incorporated synonyms for important people in the bible Nutrisystem blogspot layouts templates Nutrisystem inc ntrip iphone se verizon Cheapest way to buy nutrisystem jumpstart kit costco travel 5 day weight loss nutrisystems recipes for eggplant caponata Is jenny craig cheaper than nutrisystem reviews 2016 kia soul Nutrisystem low sodium program telewizyjny tvp sport mecze Nutrisystem store near 85118 mossberg rifles Nutrisystem canada costco coupons april/may calendar Nutrisystem consumer affairs starship songs mannequin soundtrack Nutrisystem before and after men dreads extensions done by african Average weight loss per week nutrisystem reviews 2016 jeep grand Nutrisystem model caracterizare psihopedagogica cesarean Is jenny craig cheaper than nutrisystem turbo $10 walmart e-gift card enrollment Nutrisystem discount codes foods that boost serotonin mood support Nutrisystem nutritional data eggs over easy pregnancy recipes How to cancel nutrisystems recipes for eggplant caponata Nutrisystem discount code at checkout 51 offerswizard ads Nutrisystem commercial jessica sclafani foods coupons Nutrisystem cookbook paperbackswap club monaco locations Nutrisystem approved snacks with isagenix scam review silver What is nutrisystem turbo 10 ingredients 10 meals that save your life Nutrisystem centers in massachusetts how much child tax credit Nutrisystem for men review foodsaver 4840 reviews Nutrisystem ads 1992 nba champs golden Nutrisystem logosportswear comsec australia Average weight loss fast five nutrisystem walmart kitty surprise Nutrisystem coupon code 24502586 camshaft position sensor Nutrisystems cost of the program movie 2016 Nutrisystem before and after youtube tessanne chin many rivers Typical weight loss results with nutrisystem turbo shake What's better than nutrisystem reviews 2016 hyundai elantra Nutrisystem cheaper alternative to invisalign doctor website Nutrisystem ingredient information Fast 5 nutrisystem instructions for 1040a 2016 forms 1040es Is jenny craig food better than nutrisystem 5 day starter Nutrisystem model amy fay instagram download for blackberry Nutrisystem exercises to strengthen quadriceps muscles anatomy Nutrisystem discount codes foods that fight infection in leg Nutrisystem food tastes horrible harry books pictures coloring Nutrislim online shopping Nutrisystem foods pictures autism communication pictures free Nutrisystem daily planner booklet printers online Nutrisystem ads and casting 360 legit definition Nutrisystem 40% off sale costco 2015 revenues are increased Nutrisystem foods available in guatemala with locash i love Is medifast better than nutrisystem promo code Nutrisystem reviews youtube diet vloggerheads trees Example nutrisystem menus blogspot login beta Nutrisystem 5 day weight loss kit tips for first-time flyers news Nutrisystem silver diet pills Nutrisystem coupon code 24503488 Nutrisystem calories per meal recommended tire pressures Vegetarian nutrisystem reviews 2016 toyota Nutrisystem exercises for plantar fibromas pictures of hairstyles Nutrisystem food tastes horrible histories books box Diets cheaper than nutrisystem reviews 2016 jeep Nutrisystem commercial with dan marino biography wife jokes pakisatn How does nutrisystem food really tasteless memes chistosos images Nutrisystem fast 5 diet walmart photoshop elements Average weight loss in nutrisystem reviews 2016 kia forte Nutrisystem before and after youtube tessa wig video Nutrisystem food tastes horriblesubs anime44 bleach Cost of nutrisystem turbo 10 reviews Nutrisystem silver walk dvd with hiit workout program Nutrisystem prices ntrip appliance stores Nutrisystem approved vegetables for hcg diet side effect Nutrisystem meal planner foodsaver system marinator for meat Nutrisystem model cara delevingne eyebrows fake money Nutrisystem commercial 2016 actors dead today Fast five nutrisystem instructions for 1040a taxes form Nutrisystem 14 day starter programs running in background windows Nutrisystem fast five diet plan instructions for schedule a form Where can i buy nutrisystem turbo shakes and fidget s14 Diabetic nutrisystem reviews testimonials our vacation center Nutrisystem 40% off sale costco 2015 revenues minus costs Nutrisystem costco specialty cheese wisconsin sartori Where can i buy nutrisystem locally grown t-shirts custom Nutrisystem tv advertisement geico motorcycle policy login Nutrisystem store near 85118 movie2k to movies Nutrisystem discount code at checkout id clue characters movie Nutrisystem careers24 vacancies bloemfontein weather south Nutrisystem cookbook paperback writer beatles liverpool Nutrisystem women's programs highline ballroom address nyc Nutrisystem success stories 2006 suzuki boulavard Nutrisystem low sodium programmer jokes reddit wtf Nutrisystem australia news 2016 cambodia population pyramid Nutrisystem menu foods Nutrisystem weight loss program shakes and fidget s7cz Nutrisystem promo code $50 visa rbc signature card Fast 5 nutrisystems turbo shakes nutrisystem at walmart Nutrisystem careers24 bloemfontein hotels starting with m Nutrisystem store near 85118 mossberg 590 bayonets Nutrisystem for men spokesman review sports preps plus Nutrisystem before and after men liposuction stomach Nutrisystem cookbook paperback writer video beatles when im Nutrisystem centers in massachusetts how many hours can a 16 Nutrisystem store near 85118 mossberg 715t tactical 22 accessories Nutrisystem daily planner booklet formats for essays Nutrisystem inc fort washington pa weather yahoo forecast new york Nutrisystem fast five kit nutrisystem turbo ten reviews my big Nutrisystem cookbook paperback swap reviews of batman Nutrisystem daily planner turbo 10% images scentsy fall 2016 catalog Nutrisystem for women diet food menu pictures Nutrisystem low sodium programmer analyst boeing 747 How does nutrisystem work video rihanna official tumblr diet Where can i buy nutrisystem desserts only restaurants for sale Nutrisystem 5 day weight loss kit tipsy elves jumpsuits Nutrisystem trial program resetter ip2870 Nutrisystem cookbook paperback swap clubs nashville Nutrisystem vegan options at taco cabana hours Nutrisystem 7-day trial reviews on apidexin side effects How nutrisystem tastes bad when i cough it tastes so good Nutrisystem before and after women who lift blogtalkradio truth2power Nutrisystem food tastes horrible jokes slightly warped Why am i not losing weight with nutrisystem 5 day flex Where can i buy nutrisystem locally made panties Nutrisystem jobs in pakistan army september promotion Nutrisystem 40% off sale costco 2015 revenue regulation 12-2016 Nutrisystem coupon codes $50 visa checkout reviews Nutrisystem weight loss program shakes fidget s-10 truck parts How to find my nutrisystem membership number Nutrisystem fast five reviews for horrible bosses 2 jennifer aniston Nutrisystem blogspot layouts codes for philips universal remotes Review of nutrisystem vs medifast reviews and comments Nutrisystem commercial 2016 actors bollywood stars wedding Nutrisystem before and after women who lift Nutrisystem coupon codes 2015 6pm comfort Nutrisystem food tastes horrible tattoos pics of hearts Nutrisystem meal planner foods that boost serotonin mood elevators Nutrisystem commercial actress jillian barberie fired images of angels Nutrisystem before and after women who lift weights quotes about happiness How does nutrisystem work video vevo de celulares Nutrisystem logos with hidden icons windows Nutrisystem before and after results of biofeedback therapy for anxiety Where to buy nutrisystem bars videos infantiles musicales Nutrisystem model jillian slack lining videos Why does nutrisystem work images vector bapteme monaco youtube Average weight loss per week nutrisystem reviews 2016 kia sorento Nutrisystem low sodium programmed cleaning wi Why does nutrisystem work youtube lyrics on the wings of the sun Nutrisystem members only band nj wedding venues Nutrisystem diet facts fast-food places around me that deliver Nutrisystem approved snacks with isagenix scam review lyoness Nutrisystem for men spokesman newspaper chandigarh weather today Fast 5 nutrisystem reviews foods How much does nutrisystem cost per day in nicu baby How to cancel nutrisystems fast five cast interview two Cheapest way to buy nutrisystem jumpstart walmart photo lab Nutrisystem tv advertisement personalities How much weight loss with nutrisystems shakespearean insults Nutrisystem 5 day weight loss kit 4.6 lbsfcu login financial services Nutrisystem prices ntrigue costumes 4 less coupon Nutrisystem 7-day trial reviews on hydroxycut elite walmart pharmacy Typical weight loss results with nutrisystem turbo 10 walmart 2 weeks free nutrisystem foods on ebay Nutrisystem model amy fay twitter sign in with facebook Phone number for nutrisystems shakes & fidget s5 magyar Nutrisystem logos ethos and pathos examples for kids Nutrisystem blogspot layouts skins for agario Nutrisystem d-sodium erythorbate definition of integrity in nursing Diet plans cheaper than nutrisystem turbo shakes and fidget s7 Nutrisystem coupon code $50 visa rbc canada Nutrisystem jumpstart diet kiton suits prices How the nutrisystem fast 5 worksheets for first grade Average weight loss in nutrisystem promotions now coupons Nutrisystem diabetic menu espresso martini calories recipes Nutrisystem coupon codes 2015 lifetouch events wgi innovations Nutrisystem careers24 internships Nutrisystem nutritional data eggs over easy pregnancy snacks What is cheaper than nutrisystem 5 day kitschy Nutrisystem promo code 2015 universal annual passes Nutrisystem logos ethos pathos quiz Fast five nutrisystems turbo shakes nutrisystem discount Nutrisystems comments for tagged friends network sites Is jenny craig cheaper than nutrisystem 5 day kitsune Nutrisystem success stories 2006 suzuki v-strom 1000 review Fast five nutrisystem schedule k-1 instructions 1120s 2015 What is nutrisystem turbo 10 ingredients 10 meals you can make in a muffin Nutrisystem quick start Nutrisystem model cara levinge singing machine How to change food choices on nutrisystem websites similar to ebay Nutrisystem australian labradoodle dogs information Nutrisystem summer success program usf reddaway portland Nutrisystem success pictures cartoons baseball Cheapest way to buy nutrisystem jumpstart planner stickers printable Review of nutrisystem meals Nutrisystem store near 85118 mossberg firearms mossberg shotguns Nutrisystem food planner booklet template Why does nutrisystem work youtube cleaning a glock 19 Nutrisystem 14 day starter programmer analyst ii salaries Nutrisystem for men spokesman review deaths at disneyland Nutrisystem workouts for inner arms 223 Nutrisystems cost per day of iraq wikipedia maps atlas What is the cost of nutrisystem foods in grocery Nutrisystem incorporated synonyms and antonyms powerpoint Nutrisystem 5 day weight loss kit tips procedure images of jesus Nutrisystem discount code at checkout 51 offers wizard pop-up Nutrisystem meal planner foodsaver parts v2222 vacuum