Dynamisches Mappen zwischen Typen

Manchmal kommt es vor, dass ein anderer Typ als der gegebene notwendig ist und das, obwohl dieser die gleichen Eigenschaften besitzt. Und mit diesem Satz möchte ich den nächsten Beitrag einleiten, denn diesmal geht es darum Typen zu Mappen. Dies kann erforderlich sein, wenn von einem SOAP-Service Datentypen vorgegeben werden, diese aber in eigene verpackt werden müssen, um diese mit speziellen Eigenschaften zu versehen und anschließend in der Oberfläche, im ViewModel oder im Model verwenden zu können. Im Prinzip bietet C# seit Version 2.0 dafür schon etwas passendes an, nämlich die generics. Aber um den Blogbeitrag sinnvoller zu gestalten, benötigen wir noch etwas – ein eigenes Attribut. Beginnen wir also mit diesem.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class IgnoreOnMapAttribute : Attribute 
{ }

Relativ simpel gehalten, soll uns dieses Attribut lediglich die Möglichkeit schaffen bestimmte Eigenschaften beim Mapping zu überspringen. Es muss lediglich existieren.  Weiterlesen

Ein eigener Datentyp (Teil 1)

Ein eigener Datentyp kann dann sinnvoll sein, wenn es Voraussetzung ist, Daten in ein Gerät zu schreiben bei denen der Speicherplatz begrenzt ist oder wenn es notwendig ist einen Typen mit einer ganz speziellen Interaktion zu besitzen. Aber wie kann man einen eigenen Datentyp mit sämtlichen Funktionalitäten wie z.B. die eines Integers erzeugen? Nun eigentlich ist das gar nicht so schwer wie man vielleicht denkt, denn .NET bietet dafür bereits einige Schnittstellen an und der andere Teil sind überwiegend die korrekten Operator-Überladungen. In Rahmen dieser Mini-Serie möchte ich einen eigenen 24-Bit großen Integer erstellen, wie man ihn z.B. bei einigen Feldgeräten benötigt. Am Ende des letzten Teils werde ich anschließend den Quellcode sowohl für die Signed, als auch für die Unsigned Variante dieses Typen anhängen. Aber beginnen wir nun mit den Int24-Typen.

Zunächst einmal muss klar sein, was der Unterschied zwischen einer Struktur und einer Klasse ist,  dies wird hier allerdings vorausgesetzt. Und das ist auch eigentlich schon alles was notwendig ist, um den Typen zu erstellen. Wir werden ebenfalls die selben Attribute sowie Interfaces wie ein Int32 verwenden, um die Kompatibilität zu maximieren.  Weiterlesen

Simpler SplashScreen in WPF/C#

Um unter WPF/C# einen simplen SplashScreen anzuzeigen, benötigt es keinerlei Zusätze, außer einer Grafik die angezeigt werden soll. Es ist nicht einmal erforderlich ein eigenes Fenster zu erstellen – insofern keine komplexen Sachen wie Fortschrittsanzeige etc. gewünscht sind (hierfür kann folgendes verwendet werden: http://www.codeproject.com/Articles/38291/Implement-Splash-Screen-with-WPF). Für eine einfache Anzeige hingegen benötigt es nur eine Referenz auf den „System.Windows“ Namespace und schon kann in der „OnStartup“-Methode der App.xaml.cs ein SplashScreen angezeigt werden.

SplashScreen splash = new SplashScreen("SplashScreenImagePath.Type");
splash.Show(true);

Dies genügt bereits, um den SplashScreen anzeigen zu können. Das „true“ in der „Show“-Methode sorgt hierbei für ein Auto-Close, sobald das Hauptfenster angezeigt wird, andernfalls kann mittels „Close“-Methode das schließen ausgelöst werden.

WPF Lokalisierung

Eine häufige Anforderung im Berufsalltag ist es eine Anwendung in mehreren Sprachen anzufertigen. Während C# / VB hierfür sehr simpel auf RESX-Dateien zugreifen kann, ist vielen nicht klar, dass WPF dies ebenfalls beherrscht. Wie das ganze in C# funktioniert, kann älteren Blog-Beiträgen zur SmallMVVM-Reihe entnommen werden, da dies dort bereits Anwendung gefunden hat. Die RESX-Dateien werden hierfür genauso angelegt wie bereits unter C#, d.h. „Resources.de-DE.resx“ für z.B. Deutsch und „Resources.resx“ für die Standardwerte. Sollte der Eintrag in der speziellen Sprache nicht vorhanden sein, wird standardmäßig der aus der normalen Ressource verwendet, also aus der Standard-Datei.

Um das ganze nun in WPF nutzen zu können, muss zunächst ein „xmlns“, ein WPF-Using, angelegt werden. Dieser sieht wie folgt aus:

xmlns:resx="clr-namespace:<DefaultNamespaceOfProject>.Properties"

Anschließend können die Controls ein normales Binding auf Werten aus der genannten Resourcedatei durchführen. Hier sollte beachtet werden, dass dies nur String-Texte sind – Lokalisierungen eben. Das Ganze ist nicht für Einstellungen zu verwenden, dafür gibt es eigene Mechanismen.

<Label Content="{x:Static resx:Resources.<NameOfYourResource>}" />

Auf Administratorrechte prüfen

Hin und wieder ist es erforderlich, dass eine Anwendung oder Teile einer Anwendung mit Administratorrechten ausgeführt werden. Hierfür gibt es in .NET die Möglichkeit eine Überprüfung auszuführen und ggf. die Anwendung mit entsprechenden Rechten neuzustarten. Fälschlicherweise wird bei diesen Methoden oft angenommen, dass hiermit die Administratorrechte des Benutzers geprüft werden, dem ist aber nicht so – wozu auch. Es werden die Rechte geprüft mit welcher die Anwendung derzeit ausgeführt wird, nicht mehr und nicht weniger. Und natürlich kann man das so genannte UAC-Token (User Account Control) welches Windows zum Rechte setzen verwendet auch beim Start der Anwendung anfordern.

Aber zunächst einmal der einfache Teil; das Auslesen der aktuellen Rechte welche die Anwendung besitzt. Hierfür können wir uns eine Methode schreiben, welche sich lediglich dem „System.Security.Princial“-Namespace bedienen muss. Diese Methode würde wie folgt aussehen:

static bool RunAsAdmin()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    if (identity != null)
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity); 
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    return false;
}

Nun da wir die Möglichkeit haben zu bestimmen ob wir die ausreichenden Rechte haben, wäre es hilfreich ggf. die Anwendung mit Administratorrechten erneut ausführen zu können. Weiterlesen

Async und Await in .NET 4.0

Vielen dürften inzwischen die geliebten Schlüsselwörter „async“ und „await“ ein Begriff sein. Diese haben die asynchrone Programmierung unter .NET sehr stark vereinfacht sind jedoch leider erst im neusten Framework standardmäßig verfügbar – dem .NET 4.5. Seit Mitte April gibt es aber hierfür nun eine Abhilfe, welche es immerhin ermöglicht diese Funktionalität unter .NET 4.0 bereits zu verwenden. Denn das größte Problem des .NET 4.5 ist, die nicht vorhandene Kompatibilität zu dem immer noch stark verbreitetem Windows XP.

Wie das Ganze zu nutzen ist, kann eigentlich der NuGET Galerie entnommen werden. Denn nach der Installation funktioniert dies wie bereits unter .NET 4.5. Der Link zum entsprechenden NuGET Galerie Eintrag ist am Ende des Posts zu finden. Es ist jedoch eigentlich nichts weiter nötig als das Package „Microsoft.Bcl.Async“ zu installieren, welches über die NuGET Paketverwaltung oder über die Paket-Manager-Konsole mit folgendem Befehl erfolgt:

Install-Package Microsoft.Bcl.Async

Weiterlesen

Zeichenketten Verschlüsselt im Arbeitsspeicher

Wer sieht schon gerne seine Daten als Klartext im Speicher, so dass diese von jedem Programm genutzt werden können? Seit .NET 2.0 gibt es für Zeichenketten eine Abhilfe, denn die Klasse „SecureString“ sorgt genau dafür, dass die Daten mithilfe der DPAPI (Data Protection API) verschlüsselt im Speicher laden. Diese API sorgt dafür, dass die Daten erst beim erneuten Zugriff durch das ablegende Programm entschlüsselt werden. Um dies zu erzielen, kann eine einfache Methode implementiert werden, welche aus einem String ein SecureString Object erzeugt.

Zunächst einmal benötigen wir zwei Using-Directives, um die nötigen Methoden zur Verfügung gestellt zu bekommen. Diese wären Folgende:

using System.Security; 
using System.Runtime.InteropServices;

Anschließend können wir nun die Methode implementieren. Bevor wir dies jedoch tun, sollten wir in unserem Projekt die Verwendung von unsicherem Code zulassen, dies geschieht über die Projekteigenschaften. Weiterlesen

ASP.NET Ladezeitenoptimierung

Die Problematik zu langer Ladezeiten bei Webseiten – besonders bei mobilen Endgeräten – kennt denke ich, nahezu jeder. Allerdings gibt es auch hier sehr simple Möglichkeiten dies ohne wirkliche Änderungen am Quellcode zu optimieren. Und zwar wird seit dem VS2012 in den ASP.NET-Projektvorlagen die Assembly „System.Web.Optimization.dll“ mit geliefert. Ebenfalls kann diese mit NuGET nachträglich ohne Anstrengungen hinzugefügt werden.

Aber was macht diese Assembly eigentlich? Das ist eigentlich gar nicht so schwer. Im Kern optimiert sie die Java Script sowie Cascading Style Sheet Dateien durch Zusammenfassung und Entfernung von Leerräumen. Hierbei hat dennoch der Entwickler die Freiheit zu entscheiden, was optimiert wird, zumindest was den Zusammenfassungsteil angeht. Denn, damit die Zusammenfassung aktiv wird, müssen nicht länger die CSS- und JS-Dateien einzeln referenziert werden, sondern über eine zentrale Referenzierung, dazu aber gleich mehr. Nun wäre ja noch die Frage offen, wie diese zu verwenden ist. Wie bereits gesagt erfordert dies kaum Anpassungen am Quellcode und würde wie folgt ablaufen.

Weiterlesen

Interessanter .NET-Blog

Ein neuer, dennoch bereits jetzt hochinteressanter Blog hat vor wenigen Tagen das Licht der Welt erblickt. Der Autor bringt hier bis jetzt zwar ausschließlich Themen aus dem Bereich „WPF“ zum Vorschein, dies jedoch in wirklich kurzen Abständen. So haben sich zwischen dem 16. und 22. Mai bereits 8 Beiträge zu interessanten und vor allem sehr hilfreichen Themen angesammelt. Jeder der an diesen Beiträgen Interesse hat, kann nun folgendem Link folgen: http://xp-development.blogspot.de/

Windows-Suche mit WinRT

Um die Windows-Suche über die WinRT-Library verwenden zu können, ist zunächst eine Referenz auf eben jene notwendig. In einer Windows-Store Anwendung ist dies das geringere Problem, in WPF- und WinForms-Anwendungen hingegen sieht dies schon wieder anders aus. Denn bei Letzteren steht diese Assembly – selbst bei der Verwendung des neuesten Studios auf Windows 8 – nicht in der Liste der zur Verfügung stehenden Assemblys. Aber wie kann man es auch anders erwarten. Natürlich gibt es auch hierfür wieder einen Trick.

Um die WinRT-Library auch in diesen Anwendungen nutzen zu können, müssen lediglich folgende Schritte durchgeführt werden:

  1. Visual Studio nach Anlegen des Projektes schließen. 
  2. Die jeweilige *.csproj-Datei im Editor bearbeiten.
  3. Das Tag „TargetPlatformVersion“ suchen und hier den Wert „8.0“ bzw. ab Windows Blue auch „8.1“ einfügen.
  4. Die Änderung speichern und das Projekt wieder im Studio öffnen.

Nun ist es möglich, die WinRT-Library wie normale .NET-Assemblys zu referenzieren. Allerdings sollte man sich darüber im Klaren sein, dass die resultierende Anwendung auch nur für die entsprechenden Systeme ausgelegt ist und somit nicht mehr unter Windows 7 oder älteren Windowsversionen funktioniert.  Weiterlesen