Schlagwort: C#

DNS-Cache unter Windows und mit C# leeren 👍 👎

Um den DNS-Zwischenspeicher unter Windows zu leeren, gibt es den bekannten Befehl ipconfig /flushdns.

Prinzipiell wäre es zwar möglich, das Programm ipconfig mit dem Argument /flushdns über die Process-Klasse per C# aufzurufen, jedoch ist dies nicht ganz unproblematisch, da die Ausführung längere Zeit dauern kann.

Alternativ hilft uns hier – wieder einmal – die Windows-API in Kombination mit dem DllImport-Attribut:
(Hilfs-)Methode deklarieren und verwenden
01020304050607
public static class DnsUtility {    [DllImport("dnsapi", EntryPoint = "DnsFlushResolverCache")]    public static extern void FlushCache();}
// DNS-Cache leerenDnsUtility.FlushCache();
Dies ist insbesondere in Verbindung mit der Dns-Klasse nützlich, um aktuelle Daten zu erhalten. Natürlich gibt es einen solchen Zwischenspeicher aber nicht grundlos, d. h. es ist nur äußerst selten ratsam, diesen immer wieder vor einer Namensauflösung zu leeren – Performanzdifferenzen im Rahmen einer Größenordnung sind hier üblich. Im Rahmen des Debuggings oder für besonders kritische Prozesse kann das Vorgehen jedoch durchaus sinnvoll sein.

Bezeichner eines Members mit C# ermitteln 👍 👎

Bei C# kommt man beispielsweise bei der Fehlerbehandlung (z. B. per ArgumentException und abgeleiteten Klassen), Logging (im Sinne von "Methode MethodName betreten/verlassen") oder auch beim Routing im Rahmen des ASP.NET MVC-Frameworks in die Notwendigkeit, Programmbezeichner als Zeichenketten anzugeben.

Etwas ärgerlich ist hier jedoch immer, was man bei grundsätzlich statisch typisierten Sprachen wie C# für gewöhnlich vermeiden möchte: Derartige Zeichenketten sind literal hinterlegt und dementsprechend einer Refaktorierung nicht ohne Weiteres zugänglich. Dieses Problem löst nun das relativ neue Konstrukt nameof, indem es die (einfachen) Bezeichner von Variablen, Typen und Membern als Zeichenkette liefert:
Beispiel-Klasse definieren und Member-Bezeichner ermitteln
01020304050607080910111213141516171819202122
public class Person {    public string FirstName {        get;        set;    }
public string LastName { get; set; }

public void Marry(Person person) { /* … */ }}

Debug.WriteLine(nameof(Person)); // "Person"Debug.WriteLine(nameof(Person.FirstName)); // "FirstName"Debug.WriteLine(nameof(Person.LastName)); // "LastName"Debug.WriteLine(nameof(Person.Marry)); // "Marry"
Praktisch ist nun, dass bei der Umbenennung einer Eigenschaft oder Methode, sich dieser Vorgang auch auf die entsprechende Verwendung innerhalb von nameof auswirkt und somit für Konsistenz sorgt.

Ein weiterer theoretischer Anwendungsfall ergibt sich im Rahmen einer INotifyPropertyChanged-Implementierung, jedoch lässt sich dieses Problem auch ganz ohne manuelle Angabe per CallerMemberName-Attribut lösen, wie ich in einem früheren Beitrag bereits beschrieben habe.

Anwendungssymbol mit C# extrahieren 👍 👎

Desktop-Anwendungen (*.exe) enthalten häufig ein Programmsymbol, welches insbesondere im Windows Explorer und auf der Taskleiste angezeigt wird. Das Ermitteln dieses Anwendungssymbols, beispielsweise für eigene Auflistungen, ist sehr einfach über Icon.ExtractAssociatedIcon() realisierbar:
Anwendungssymbol extrahieren
0102030405060708091011
using(Icon icon = Icon.ExtractAssociatedIcon("devenv.exe")) {      // Programmsymbol als *.ico-Datei speichern    using(FileStream fileStream = File.OpenWrite("devenv.ico")) {        icon.Save(fileStream);    }
// Programmsymbol als *.png-Datei speichern using(Bitmap bitmap = icon.ToBitmap()) { bitmap.Save("devenv.png", ImageFormat.Png); }}
Bitte beachtet wie üblich in solchen Fällen, dass die Verwendung der Grafik rechtlich eingeschränkt sein kann.

Arbeitsplatz mit C# sperren 👍 👎

Das Sperren des Arbeitsplatzes lässt sich unter Windows beispielsweise über die Tastenkombination [Win] + [L] erreichen. Aber auch mit C# lässt sich dies sehr einfach per LockWorkStation und DllImport bewerkstelligen:
Wrapper implementieren
01020304
public static class Workstation {    [DllImport("user32", EntryPoint = "LockWorkStation")]    public static extern bool Lock();}
Die Verwendung gestaltet sich nun äußerst einfach und selbsterklärend:
Wrapper verwenden
01
Workstation.Lock();

Base64-Kodierung mit C# 👍 👎

Zur verlustfreien Speicherung und Übertragung von Binärdateien als Text kommt häufig die Base64-Kodierung zum Einsatz. C# unterstützt die (De-)Kodierung dieser Daten in ihrer üblichen Darstellungsform als Zeichenkette sehr komfortabel über die beiden Methoden Convert.ToBase64String und Convert.FromBase64String:
Base64-Konvertierung
01020304
byte[] input = Encoding.UTF8.GetBytes("Hällö!");   // [72, 195, 164, 108, 108, 195, 182, 33]
string base64 = Convert.ToBase64String(input); // "SMOkbGzDtiE="byte[] output = Convert.FromBase64String(base64); // [72, 195, 164, 108, 108, 195, 182, 33]
Die verbreitete Darstellung mit Zeilenumbrüchen nach jeweils 76 Zeichen wird durch die Option Base64FormattingOptions.InsertLineBreaks ermöglicht.

Spannender als mit einer einfachen Zeichenkette ist dieses Vorgehen natürlich bei komplexen Dateien, wie sie beispielsweise im Zusammenhang mit X.509-Zertifikaten auftreten. Praktisch ist dies, da die kodierte Zeichenkette nur noch aus lesbaren ASCII-Zeichen besteht und folglich keine Probleme mit Zeichensätzen zu erwarten sind. Darüber hinaus können derart kodierte Grafiken beispielsweise direkt in Webseiten eingebettet werden.

Offensichtlich sollte dieses Verfahren jedoch nicht zur "Verschlüsselung" sensibler Daten verwendet werden.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche