Neuigkeiten in der .NET-Klassenbibliothek, Teil 2: Assembly-Metadaten

Der Dotnet-Doktor  –  0 Kommentare

Die Version 4.5 der .NET-Framework-Klassenbibliothek enthält 947 neue Klassen. Eine Artikelserie stellt zehn Neuerungen vor, die nicht die großen Bibliotheken betreffen und daher nicht so im Licht der Öffentlichkeit stehen. Nachdem Anfang der Woche Aufruferinformationen vorgestellt wurden, geht es heute in Teil 2 um Assembly-Metadaten.

Bisher schon konnte man in .NET Metadaten auf Assembly-Ebene hinterlegen, zum Beispiel:

[assembly: AssemblyTitle(".NET 4.5-Demo-Konsole")]
[assembly: AssemblyDescription(".NET 4.5 Demos als Konsolenanwendung")]
[assembly: AssemblyCompany("www.IT.Visions.de")]
[assembly: AssemblyProduct(".NET 4.5 Update")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: ComVisible(false)]
[assembly: Guid("a5978324-95d7-4791-b224-392b9b53fd82")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Die Angaben können in jeder beliebigen Quellcodedatei in einem Projekt erfolgen, typischerweise legt man sie aber in die Datei AssemblyInfo.cs/.vb.

Neu in .NET 4.5 ist, dass man nun beliebige Metadaten in Form von Namen-Wert-Paaren auf Assembly-Ebene ablegen kann:

[assembly: System.Reflection.AssemblyMetadata("Autor", 
"Dr. Holger Schwichtenberg")]
[assembly: System.Reflection.AssemblyMetadata("Erstellungsdatum",
"16 August 2012")]
[assembly: System.Reflection.AssemblyMetadata("Website",
"www.IT-Visions.de")]

Aber Achtung: Diese Metadaten erscheinen nicht im Windows Explorer in der Details-Ansicht. Man kann nur per .NET Reflection die Daten wieder auslesen (siehe das folgende Listing). Zudem ist zu beachten, dass man nur statische Werte angeben kann. Ausdrücke, die erst zur Laufzeit berechnet werden, zum Beipiel new DateTime(2012,08,16) sind nicht erlaubt.

// Zugriff auf eine Assembly, z.B. aufrufende Assembly
var ass = System.Reflection.Assembly.GetCallingAssembly();
// Zugriff auf Metadatenliste
var liste = ass.GetCustomAttributes(typeof(AssemblyMetadataAttribute),
false);
if (liste != null && liste.Length > 0)
{
// Name-Wert-Paare ausgeben
foreach (AssemblyMetadataAttribute i in liste)
{
Console.WriteLine(i.Key + ": " + i.Value);
}
}