Zeilenumbrüche in Strings

Zeilenumbrüche in Strings lassen sich auf vielen Wegen erzeugen. Oftmals wird hierfür einfach ‚\n‘ dem String angefügt. Ist dies jedoch wirklich der beste Weg? Ich würde darauf mit nein antworten. C# bzw. das .NET-Framework sieht für Zeilenumbrüche eine bessere Variante vor. Und zwar folgende:

Environment.NewLine;

Hierbei wird sichergestellt, dass im aktuellen Kontext das für den jeweiligen Kontext relevante eingefügt wird, um den Umbruch zu erzeugen.

Visual Studio 2013 und Windows 8.1 Vorschau

Nach dem heutigen „//build/“-Livestream von Microsoft kamen nach einigen Ankündigungen rund um diese neuen Systeme auch prompt die Seiten für den Preview-Download online. Windows 8.1 bzw. Windows Blue soll hierbei wieder direkt auf dem Desktop starten können und zeitgleich einige Verbesserungen sowie eine bessere Bing-Integration mit sich bringen. Das neue Visual Studio bringt wie üblich eine neue .NET-Framework Version mit sich (4.5.1) welche zusammen mit dem Studio als Vorschau herunterladbar ist. Da es sich hier um Vorabversionen handelt, sollte man sich ggf. davon distanzieren diese im Produktivsystemen einzusetzen. Ich für meinen Teil bin nun bereits am Testen mit den neuen Versionen auf entsprechenden Systemen und mir gefallen die Neuerungen bisher wirklich gut. Anschließend noch den Link zum MSDN-Blog bzgl. der VS13 Ankündigung:  http://blogs.msdn.com/b/somasegar/archive/2013/06/26/visual-studio-2013-preview.aspx

Des Weiteren hier noch die Links zum Herunterladen der beiden Vorabversionen:

Mails vom Programm versenden

In der heutigen Zeit gewinnen E-Mail’s gegenüber Briefen immer mehr an Bedeutung. Auch kann man diese wirklich gut für Bugreports verwenden. Aber wie könnte es anders sein, als dass uns das .NET-Framework auch hierfür entsprechende Methoden bereitstellt. Kommen wir zunächst zum Sourcecode, bevor ich erläutere welcher Parameter durch was zu ersetzen ist.

MailMessage mail = new MailMessage
	{
		From = new MailAddress("report@mailhoster.de", "Report Benutzer"),
		Subject = "Der Betreff der e-Mail",
		Body = "Dies ist der Inhalt der e-Mail <b>sogar mit HTML</b>.", 
		IsBodyHtml = true
	};

mail.To.Add(new MailAddress("test@mailhoster.de", "Test Benutzer"));

SmtpClient mailClient = new SmtpClient("smtp.mailhoster.de", 25)
	{
		Credentials = new NetworkCredential("report", "passwort")
	};

mailClient.Send(mail);

Weiterlesen

Ein eigener „Mini“-Downloadmanager

Hin und wieder kommt es vor, dass eine Anwendung Dateien aus dem Internet herunterladen muss. Oftmals soll hierfür auch eine Fortschrittsanzeige dargestellt werden, z.B. bei einer eigenen Update-Routine. Schön wäre es doch, wenn der Download gestartet wird, noch während man die Dateien für ein etwaiges Update zusammen sucht. Oder etwa nicht? Auch schön wäre es, wenn wir den Fortschritt des aktuellen Downloads erfahren könnten und wenn das Ganze anschließend auch noch sauber asynchron ausgeführt wird. Mithilfe der Klassen „WebClient“ und „Queue<T>“ können wir dies auch mit Leichtigkeit realisieren. Da ich den Quellcode bereits soweit vorbereitet habe, sehen wir uns das Ganze erst einmal an.

public class DownloadManager
{
    private readonly string _downloadDirectory;
    private bool _shouldAbort;

    private readonly Queue<string> _queue;
    private readonly WebClient _client;

    public double ProgressOfCurrentFile { get; private set; }

    public DownloadManager()
        : this(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"))
    { }

    public DownloadManager(string downloadDirectory)
    {
        _downloadDirectory = downloadDirectory;

        _queue = new Queue<string>();
        _client = new WebClient();

        _client.DownloadProgressChanged += (sender, args) => ProgressOfCurrentFile = args.ProgressPercentage;
    }

    public void Enqueue(string file)
    {
        _queue.Enqueue(file);
    }

    public void Abort()
    {
        _shouldAbort = true;
        _queue.Clear();
    }

    public void DownloadFiles()
    {
        Task result = DownloadFilesAsync();
        result.Wait();
    }

    public async Task DownloadFilesAsync()
    {
        _shouldAbort = false;
        if (!Directory.Exists(_downloadDirectory))
            Directory.CreateDirectory(_downloadDirectory);

        while (_queue.Count > 0 && !_shouldAbort)
        {
            string path = _queue.Dequeue();
            string filename = path.Split(new[] {'/', '\\'}).Last();

            await Task.Run(() => _client.DownloadFile(new Uri(path), _downloadDirectory + "\\" + filename));
        }
    }
}

Was haben wir hier nun? Zwei Konstruktoren, der eine ohne Parameter nutzt als Ziel für die Downloads den Benutzer-Download-Ordner, während der andere einen frei angegebenen Pfad nutzt. Zusätzlich haben wir eine Methode um Dateien dem Download hinzuzufügen, sowie eine Methode um das Ganze abzubrechen (aktuell würde diese nur zwischen Downloads abbrechen aber keine aktiven Downloads!). Und zu guter Letzt natürlich noch unsere beiden eigentlichen Download-Methoden, die eine synchron, die andere ssynchron, wobei in diesem Fall die synchrone die asynchrone nutzt und einfach auf dessen ending wartet.

Ein eigener Datentyp (Teil 6)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil 5)) haben wir uns um die Konvertierung aus Standard-Datentypen gekümmert. In diesem Teil soll es nun um die überschriebenen Methoden der Basisklasse – Object – gehen. Hier müssen wir die Implementierung für drei Methoden vornehmen, „Equals(object)“, „GetHashCode()“ sowie „ToString()“. Beginnen wir mit der „Equals“-Methode. Diese ist eigentlich auch schon die „komplizierteste“ der drei genannten. Hier würde ich die folgende Implementierung vorschlagen:

public override bool Equals(object obj)
{
    return ((obj is Int24) && (Value == ((Int24)obj).Value)) || ((obj is int) && (Value == (int)obj));
}

Weiterlesen

Get-Parameter in JavaScript nutzen

Um URL-GET-Parameter in JavaScript nutzen zu können, kann man keinen direkten Zugriff wie in PHP verwenden. Oft findet man auch im Web hierzu bereits simple Snippets, welche aber in vielen Fällen fehlerhaft sind. Dies aber erst dann auffällt, wenn Umlaute und Sonderzeichen in der URL übergeben werden. Allerdings gibt es hierfür eine simple Abhilfe. Sehen wir uns zunächst einmal den Sourcecode dazu an (im Beispiel mit jQuery):

<script type="text/javascript">
    (function ($) {
        $.GET = (function(a) {
            if (a == "") return 'undefined';
            var b = { };
            for (var i = 0; i < a.length; ++i) {
                var p = a[i].split('=');
                if (p.length != 2) continue;
                b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
            }
            return (typeof(b) != 'undefined') ? b : 'undefined';
        })(window.location.search.substr(1).split('&'));
    })(jQuery);
</script>

Aufzurufen, bei der URL „http://kruse-familie.eu/?filter=JavaScript“ wäre das Ganze nun wie folgt:

var filter = $.GET['filter'];

Nun würde in der Variable „filter“ der Text „JavaScript“ stehen. Eigentlich simpel, aber oft nützlich.

Ein Webservice aufbauen und in einer Anwendung nutzen (Grundlegendes)

Webservices werden in der heutigen Zeit immer wichtiger und diese bieten auch für viele Applikation einige nette Dienste, wie z.B. die Validierung einer Seriennummer, abfragen von Updates und mehr. Aber was benötigt man hierfür? Ich verwende für diesen Fall in der Regel einen C# .NET SOAP-Service, der einen IIS sprich einen Windows-Server benötigt. Eine ebenfalls – wie ich finde – sehr gute Alternative ist ein Webservice in PHP mit z.B. NuSOAP, der ohne Windows-Server Systeme auskommt und deswegen auch in der Regel relativ beliebt ist. Und genau mit diesen beiden werden wir uns befassen. Zunächst werde ich im nächsten Teil den IIS-Webservice erläutern, wie dieser zu erstellen ist usw. und im folgenden Teil den PHP-Webservice. Im letzten anschließenden Abschlussteil werde ich einen der beiden referenzieren und nutzen (da bei beiden Services die Nutzung gleich ist und mir derzeit nur ein Linux-Server zur Verfügung steht, wird dies auf NuSOAP mit PHP hinauslaufen).

Aber was sind die Vor- und Nachteile eines solchen Services? Nun die Vorteile sind ganz klar, dass die Anwendung nur kontrollierte Dinge tut und auch die Validierung von Seriennummern etc. sicher abläuft. Natürlich sollte man die Verbindung zum Webservice auch noch per SSL absichern, aber dies ist ein eigenes Thema für sich. Es könnte aber gut sein, dass dies ebenfalls bald kommt. Einer der Nachteile ist mit Sicherheit, dass die Verbindung zum Service notwendig ist und somit eine Lokale- oder Ethernetschnittstelle vorhanden sein muss. Natürlich kann man dies aber auch umgehen und den Service mehr optional als erforderlich gestalten.

Die kleinen Tricks in C# / .NET

Unter C# bzw. dem .NET-Framework gibt es einige kleine Tricks, mit denen man den Sourcecode noch weiter optimieren kann. Aufgrund dessen, dass diese evtl. nicht jedem bekannt sind, werde ich hier nun einige die ich als nützlich erachte auflisten.

Inkrement sowie Dekrement Operator Position
Abhängig von der Position des Inkrement bzw. Dekrement Operators wird ein anderer Effekt ausgelöst. Sehen wir uns dies einmal im Code an, damit jeder weiß was ich meine.

int value = 0;
Console.WriteLine(value++); //Output wird 0 sein. 

value = 0;
Console.WriteLine(++value); //Output wird 1 sein.

Hier steht der Operator einmal vor und einmal hinter der Variable. Und dies führt zu unterschiedlichen Effekten. Hier gilt, wenn der Operator vor der Variable steht wird vor dem Zugriff das Inkrement / Dekrement durchgeführt. Steht es dahinter erst nach dem Zugriff. Weiterlesen

PowerShell Scripte in .NET Anwendungen

Die Windows PowerShell ist eine sehr leistungsfähige Konsole, die mit stark geprägten Befehlen daher kommt. Diese ermöglichen eine ausführliche Aktionsreichweite unter Windows-Systemen. Oft sind sehr ähnliche Anforderungen oder gar die Anforderung diese Scripte ausführen zu können auch an uns Entwickler gestellt. Nun mit der Hilfe vom Microsoft .NET 4.0 und der Assembly „System.Management.Automation.dll“ ist dies auf sehr einfachem Wege möglich (.NET 4.0 ist hier leider die minimal Version, zumindest bei der Installation über NuGET, die mir bis dato als einzige bekannt ist). Um dies nun nutzen zu können, sollten wir also zunächst über die Paket-Konsole von NuGET folgende Aktion ausführen:

Install-Package System.Management.Automation

Hiermit wird die bereits genannte Assembly in unser Projekt installiert. Im Weiteren können wir uns der implementierung widmen. Ich werde dies hier anhand einer Konsolenanwendung vornehmen. Es funktioniert jedoch natürlich auch unter WPF und WinForms sowie ASP. Für das folgende Beispiel werden noch zusätzlich folgende Using-Directives benötigt:

using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Management.Automation;
using System.Text;

Und anschließend (hier aufgrund der Konsolenanwendung statisch) können wir uns der Implementierung widmen. Weiterlesen

Ein eigener Datentyp (Teil 5)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil 4)) haben wir die „Parsing“-Methoden implementiert. In diesem Teil wird es um die Methoden zur Konvertierung aus Standardtypen gehen. Unter Standardtypen verstehen sich folgende: byte, sbyte,  short, ushort, int, uint, long, ulong, float, double, decimal sowie string (welchen wir theoretisch bereits im letzten Teil implementiert haben). Beginnen wir also mit den beiden Byte-Typen.

public static Int24 ConvertFromByte(byte value)
{
    return new Int24(value);
}

public static Int24 ConvertFromSByte(sbyte value)
{
    return new Int24(value);
}

Nicht weiter kompliziert. Da ein Byte niemals außerhalb der Reichweite unseres Typen sein kann, benötigen wir keine weiteren Aktionen. Dies wird bei späteren Typen anders aussehen und auch beim UInt24 würde dies unter Umständen wegen den vorzeichenbehafteten Typen anders aussehen. Weiterlesen