Zehn Highlights in Visual Studio 2012: #1 Portable Class Libraries

Der Dotnet-Doktor  –  0 Kommentare

Mehr Infos

Microsofts Entwicklungsumgebung Visual Studio bietet in der Version 2012 eine Reihe schöner neuer Funktionen für die .NET-Programmierer. In einer kleinen Serie stelle ich in diesem Blog zehn ausgewählte Funktionen in den Bereichen Projektverwaltung und Code-Editoren vor, die mir persönlich besonders gut gefallen. Neue Funktion im Bereich Application Lifecycle Management hat schon der Beitrag "Klasse statt Masse" auf heise Developer behandelt. Angefangen sei mit Feature Nr. 1:

Es gibt immer mehr Varianten des .NET Framework, die Teilmengen des ursprünglichen Frameworks darstellen bzw. über das ursprüngliche Framework hinausgehen: .NET Compact Framework, .NET Framework Client Profile, Silverlight, .NET Metro Profile usw. Wenn Anwendungsentwickler vor der Aufgabe stehen, eine Anwendung in mehreren Anwendungsarten (z.B. Windows Desktop, Windows Phone 7.5, Windows 8) zu erstellen, entsteht natürlich der Wunsch einer gemeinsamen Programmcodebasis in einer gemeinsamen Assembly. Dabei gab es bisher zwei Herausforderungen:

  • Projekttypen verschiedener .NET-Varianten sind nicht untereinander referenzierbar.
  • Der Code-Editor in Visual Studio und Compiler gibt den kleinsten gemeinsamen Nenner der Zielplattformen nicht wieder, sondern bietet alle Klassen/Klassenmitglieder des jeweiligen Projekttyps an.

Um zu vermeiden, dass Code-Dateien kopiert werden mussten, konnte man sich bisher mit Datei-Verknüpfungen (Links) in Visual Studio behelfen. Nun aber gibt es eine bessere Lösung in Form der "Portable Class Libraries", einem neuen Projekttyp in Visual Studio 2012. Dieses sind DLL-Assemblies, die auf mehreren verschiedenen Varianten von .NET laufen können. Nach dem Neuanlegen einer "Portable Class Libraries" im Dialog "Add New Project" erscheint ein Auswahldialog, in dem man unter verschiedenen Versionen von .NET, Silverlight und Windows Phone sowie Metro-Apps und Xbox wählen kann. Zur Auswahl stehen folgende Versionen: .NET Framework 4.0 und 4.5, Silverlight 4 und 5, Windows Phone 7 und 7.5. Man muss mindestens zwei verschiedene Frameworks hier wählen, sonst macht der Dialog keinen Sinn.

Anschließend stehen in dem Projekt nur die .NET-Klassen zur Verfügung, die es in allen gewählten Ziel-Frameworks gibt. Weitere Referenzen können nicht gesetzt werden. Leider funktioniert der Object Browser nicht, um die verfügbaren Klassen zu erforschen. Die Intellisense-Funktion und der Compiler sind aber auf die verfügbaren Klassen eingeschränkt. Die "Portable Class Libraries" kann dann von anderen Projekten (in allen gewählten Ziel-Frameworks) wie eine ganz normale Assembly referenziert werden.

Auswahl der Ziel-Frameworks für eine Portable Library

Die Ziel-Frameworks können auch nachträglich in den Projekteigenschaften (Registerkarte "Library") geändert werden. Durch das Hinzufügen neuer Referenzen im "Add Reference"-Dialog können sich die möglichen Ziel-Frameworks verringern.

Referenz-Anzeige im Solution Explorer und „Add Reference“-Dialog bei einer Portable Class Library

Hinweis: Portable Class Libraries sind auch als Zusatzwerkzeug (Add-In) für Visual Studio 2010 verfügbar:
Portable Class Libraries können zum Beispiel verwendet werden, um gemeinsame Modelle und ViewModels gemäß MVVM-Pattern (Model-View-ViewModel) zu realisieren, die in verschiedenen Anwendungstypen mit verschiedenen Views in verschiedenen XAML-Dialekten (z.B. Silverlight, WPF, WinRT) verwendet werden. Wichtige (Datenbindungs-)Schnittstellen für das MVVM-Pattern (z.B. INotifyCollectionChanged, ObservableCollection(Of T), INotifyDataErrorInfo, ICommand) stehen in Portable Class Libraries zur Verfügung. Details dazu finden sich hier.

Eine Portable Class Library kann Ressourcen-Dateien (.resx) aufnehmen und dazu dienen, gemeinsame Ressourcen anwendungsartübergreifend zu verwalten. In Portable Class Libraries steht die Klasse System.Ressources.RessourceManager zur Verfügung.

Neben der Frage, ob eine bestimmte Klasse oder ein Klassenmitglied verfügbar ist, gibt es auch die Frage, ob das Verhalten gleich ist. Solche Verhaltensunterschiede kann eine Portable Library nicht beseitigen. Microsoft dokumentiert solche Fälle hier.

Tabelle der verfügbaren Assemblies im Rahmen von Portable Class Libraries

(Bild: http://msdn.microsoft.com/en-us/library/gg597391(v=vs.110).aspx)

In der MSDN-Dokumentation der .NET-Klassen wird durch ein Symbol angezeigt, ob ein bestimmtes Klassenmitglied in einer Portable Class Library zur Verfügung steht (hier: Ausschnitt der Properties der Klasse System.Uri)