Jenseits von JavaScript und HTML5: Ausblick auf .NET 4.5 und Visual Studio 11.0

Werkzeuge  –  0 Kommentare

Im Zuge von Microsofts Ankündigungen auf der BUILD über die Metro-Oberfläche in Windows 8 haben einige das .NET Framework schon totgesagt. Tatsächlich aber hat Microsoft gleichzeitig mit der Vorstellung der Windows-8-APIs neue Versionen von .NET und der Entwicklungsumgebung Visual Studio präsentiert, die ganz und gar nicht den Eindruck erwecken, dass man diese Produkte nicht mehr fortentwickelt.

Microsoft nennt das .NET Framework 4.5 ein "In-Place-Update". Das soll heißen: Durch das Installationspaket werden ein vorhandenes .NET 4.0 ergänzt und bei einigen Interna die Common Language Runtime (CLR) leicht verändert. Es gibt keine neue große Bibliothek wie bei den Vorgängerversionen. Microsoft hat "nur" viele kleine bis mittlere Verbesserungen quer durch die Klassenbibliothek umgesetzt. Dabei ist der Konzern besonders stolz darauf, dass Kundenwünsche eingeflossen sind, insbesondere über Vorschlags- und Abstimmungsportale wie aspnet.uservoice.com und visualstudio.uservoice.com.

Die auf der BUILD-Konferenz vorgestellte "Developer Preview" von .NET 4.5 und Visual Studio 11.0 läuft auf Windows 7 und 8 beziehungsweise Windows Server 2008 R2 und Windows Server "8" (noch ein Codename). Sie steht kostenfrei zur Verfügung. Neben dem Setup kann man auch ein virtuelles System inklusive "Hands-on-Labs" bekommen, das aber nicht auf den offiziellen Download-Seiten zu finden ist, sondern sich im Weblog von Brian Keller versteckt.

Eine wesentliche Änderung in .NET 4.5, die auch Modifikationen an der CLR nach sich zog, ist die Unterstützung für die WinRT-Bibliothek (Windows Runtime), die auf einer neuen, vorerst noch namenlosen Version des Component Object Model (COM) basiert. .NET-Programme können wahlweise WinRT zu .NET-Anwendungen hinzubinden, um Programme für den Windows-Desktop zu schreiben, oder aber man kann WinRT anstelle der Klassenbibliothek des .NET Framework verwenden, um Windows-Apps für die neue Metro-Oberfläche zu entwickeln. Für Details zu WinRT sei auf den Beitrag verwiesen.

Darüber hinaus hat Microsoft an der CLR vor allem den Garbage Collector nochmals überarbeitet. Geringer geworden ist auch die Installationsgröße des .NET Framework. Die Redmonder verzichten bei der Installation nun darauf, direkt zu Beginn ein Native Image aller Assemblies zu erzeugen. Dieses Image entsteht nur noch automatisch für wenige Assemblies. Das geht zu Lasten der Leistung. Stattdessen protokolliert die CLR die Benutzung von Managed Code mit und erzeugt bei Bedarf ein Native Image in einem Cache.

Neben WinRT ist das zweite wesentliche Thema in .NET 4.5 das asynchrone Programmieren. Auf Basis der in .NET 4.0 eingeführten Task Parallel Library (TPL) bietet Microsoft ein neues, sprachunterstütztes Pattern für asynchrones Programmieren. Eine Methode kann mit dem neuen Schlüsselwort async (C#) beziehungsweise Async (Visual Basic) deklarieren, dass im Laufe ihrer Ausführung die Kontrolle an den Aufrufer zurückgeben will. Eine solche asynchrone Methode kann ein Task-Objekt (aus der TPL) oder nichts zurückliefern. Die Methode sollte aber auf das Wort "async" enden. Innerhalb der asynchronen Methode wird die Kontrolle dann genau nach dem ebenfalls neuen Schlüsselwort Await beziehungsweise await an den Aufrufer zurückgegeben. Await bezieht sich immer auf ein Task-Objekt, das man entweder selbst erzeugt hat oder von einer anderen asynchronen Methode stammt.

Das folgende Listing zeigt ein Beispiel, in dem zunächst ein asynchroner HTTP-Download startet und das dann eine einfache asynchrone Warteanzeige (Ausgabe von Punkten) ausgibt. Der HTTP-Download basiert auf der neuen Methode GetAsync() in der neuen Klasse System.Net.Http.HttpClient. Die Warteanzeige verwendet einen selbsterstellten Task.

    class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hauptprogramm Start");
DownloadAsync();
Console.WriteLine("Warten auf Tastendruck");
WarteAnzeige();
Console.ReadLine();
Console.WriteLine("Hauptprogramm Ende");
}

/// <summary>
/// Asynchroner Download (Rückgabe: nichts)
/// </summary>
static private async void DownloadAsync()
{
Console.WriteLine("DownloadAsync() - Schritt 1");
Task<byte[]> task =
GetHttpAsync(new Uri("http://www.IT-Visions.de"));
Console.WriteLine("DownloadAsync() - Schritt 2");
byte[] ergebnis = await task;
Console.WriteLine("DownloadAsync() - Schritt 3");
Console.WriteLine("DownloadAsync() - Ergebnis:
" + ergebnis.Length + " Bytes empfangen");
}

/// <summary>
/// Asynchroner Download (Rückgabe: Task<T></T>)
/// </summary>
static private async Task<byte[]> GetHttpAsync(Uri currentURI)
{
Console.WriteLine("GetHttpAsync() - Schritt 1. URL =
" + currentURI);
HttpClient client = new HttpClient() {
MaxResponseContentBufferSize = 1000000 };
Console.WriteLine("GetHttpAsync() - Schritt 2. URL =
" + currentURI);
HttpResponseMessage httpRM =
await client.GetAsync(currentURI);
Console.WriteLine("GetHttpAsync() - Schritt 3. URL =
" + currentURI);
return httpRM.Content.ReadAsByteArray();
}

/// <summary>
/// Warteanzeige mit eigenem Task-Objekt
/// </summary>
static private async Task WarteAnzeige()
{
var t = new Task(() => Print(10));
t.Start();
await t;
}

/// <summary>
/// Methode für Task in WarteAnzeige()
/// </summary>
static private void Print(int Anzahl)
{
for (int i = 0; i < Anzahl; i++)
{
Console.Write(".");
System.Threading.Thread.Sleep(100);
}
}
}

Abbildung 1 zeigt das Ergebnis. Durch Drücken einer Taste kann man die Konsolenanwendung jederzeit beenden. In dem Stil sollen zahlreiche Klassen in der .NET-Klassenbibliothek (z. B. System.IO und System.Data) neue asynchrone Methoden erhalten. In der derzeit verfügbaren Preview ist das aber noch nicht komplett umgesetzt.

Ausgabe des asynchronen Beispiels aus dem ersten Listing (Abb. 1)

Für das Annotieren der Methodenparameter bieten der C#-5.0- und VB-11.0-Compiler sogenannte Caller Info Attributes ([CallerFilePath], [CallerLineNumber], [CallerMemberName]). Dadurch erhält die gerufene Methode Informationen über den Aufrufer (vgl. __FILE__ und __LINE__ in C++).

Visual Basic wird durch die Übernahme der Schlüsselwörter Global (zur Namensraumfestlegung) und Yield (zur Iterator-Implementierung) noch ebenbürtiger zu C#. Auch die in Visual Studio 2010 für C# eingeführte Call-Hierarchy-Ansicht in der Entwicklungsumgebung gibt es nun für Visual Basic.

Auf der BUILD-Konferenz präsentierte C#-Schöpfer Anders Hejlsberg auch schon die übernächste Version der Sprach-Compiler, die unter dem Motto "Compiler as a Service" steht. Roslyn ist der Codename für das Projekt, in dem Microsoft die Compiler von C# und Visual Basic .NET in einzelne Dienste zerlegen will, mit dem Ziel, dass der Kompilierungsprozess keine Blackbox mehr ist, sondern sich beeinflussen lässt. Das ermöglicht zum Beispiel interaktives C# inklusive IntelliSense-Funktionen und Refactoring. Roslyn soll es im Oktober als Vorabversion geben.