Assembly-Meta-Daten (AssemblyInfo.cs) in .NET Core

Der Dotnet-Doktor  –  0 Kommentare

In .NET-Core-Projekten werden die Metadaten im Standard in der Projektdatei gespeichert. Eine AssemblyInfo.cs wie im klassischen .NET ist aber dennoch möglich.

Mit der Ankündigung von Microsoft im Mai 2019, dass das klassische .NET Framework nicht mehr weiterentwickelt wird, steigen nun immer mehr Entwickler auf .NET Core um. Viele Dinge sind in .NET Core gleich geblieben, aber es gibt doch einige (überraschende) Unterschiede.

AssemblyInfo.cs

In meinen Schulungen und Beratungseinsätzen kommt immer wieder die Frage auf, wo die Datei AssemblyInfo.cs in .NET Core geblieben ist. Diese Datei gehört zum Standardinhalt aller klassischen .NET-Projekte und speichert Metadaten über eine Assembly (DLL, EXE) wie die Versionsnummer, den Hersteller und Copyright-Informationen. Diese Informationen hat der Compiler automatisch in die Metadaten der erstellten Assembly verpackt. Der Nutzer kann sie im Windows Explorer sehen. Der Entwickler kann sie auslesen zur Laufzeit, wobei es teilweise mehr als einen Weg gibt:

   string metadaten = "";
// Aktuelle Assembly
System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
// Versionsinfo der Assembly
Version version = ass.GetName().Version;
// Versionsinfo der Datei
var versionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(ass.Location);
metadaten += "Assemblyversion: " + version.ToString() + "\n";
metadaten += "Dateiversion: " + versionInfo.FileVersion + "\n";
metadaten += "Firma: " + versionInfo.CompanyName + "\n";
metadaten += "Firma (alternativer Weg): " + GetAssemblyAttribute<System.Reflection.AssemblyCompanyAttribute>(ass)?.Company + "\n";
metadaten += "Produkt: " + versionInfo.ProductName + "\n";
metadaten += "Produkt (alternativer Weg): " + GetAssemblyAttribute<System.Reflection.AssemblyProductAttribute>(ass)?.Product + "\n";
metadaten += "Kommentare: " + versionInfo.Comments + "\n";
metadaten += "Copyright: " + GetAssemblyAttribute<System.Reflection.AssemblyCopyrightAttribute>(ass)?.Copyright;

Nun war auch es im klassischen .NET keine Pflicht, dass es eine solche AssemblyInfo.cs im Projekt geben musste. Aber wenn sie nicht existierte, dann lieferten die entsprechende APIs auch keine Daten bzw. die Versionsnummer wurde als 0.0.0.0 angezeigt.

Keine AssemblyInfo.cs im Standard in .NET Core

In einem .NET Core-Projekt (egal ob WPF, Windows Forms, Konsole oder Web mit ASP.NET Core) wird im Standard keine AssemblyInfo.cs angelegt. Die folgende Abbildung zeigt das Beispiel der Projektvorlage für WPF in .NET Core 3.0:

Metainformationen in der .NET-Core-Projektdatei

Nun verwundert es aber, dass in einem .NET-Core-Projekt es sehr wohl Informationen von dem API gibt. Die Version wird als 1.0 geliefert, bei Firma und Produkt bekommt man den Projektnamen. Copyright und Kommentar bleiben aber leer.

Man sieht die Informationen, wenn man sich in den Projekteigenschaften die Registerkarte "Package" ansieht:

Man könnte denken, Microsoft hat diese Information in den Projektdatei gepackt, aber dort sind aber nicht zu finden. Sie werden dynamisch erst beim Kompilieren erzeugt und in eine Datei "\obj\Debug\netcoreapp3.0\NETCoreConsolApp.AssemblyInfo.cs" abgelegt.

Nun gilt: Wenn man diese Informationen in den Projekteigenschaften in der Registerkarte "Package" ändert, dann speichert Microsoft diese Änderungen in der Projektdatei.

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
<Version>1.1.0.0</Version>
<Authors>Dr. Holger Schwichtenberg</Authors>
<Company>www.IT-Visions.de</Company>
<Product>NETCoreBeispiele</Product>
<Description>Beispiel für das Ändern der AssemblyInfos</Description>
<Copyright>(C) Dr. Holger Schwichtenberg 2019</Copyright>
<PackageReleaseNotes>v1.0 erste Version, v1.1 verbessertes Layout</PackageReleaseNotes>
<PackageProjectUrl />
<PackageTags>Demo,Console</PackageTags>
</PropertyGroup>
</Project>

Eigene AssemblyInfo.cs in .NET Core

Wenn man eine AssembyInfo.cs in dem Projekt anlegt (auch beim Migrieren von einem klassischen .NET-Projekt herüberkopiert), beschwert sich der Compiler, dass nun einige Attribute doppelt sein. Dies ergibt sich daraus, dass ja bereits die "\obj\Debug\netcoreapp3.0\NETCoreConsolApp.AssemblyInfo.cs" generiert wurde und nun also zwei AssemblyInfo-Dateien kompiliert werden.

Wenn man eine eigene AssembyInfo.cs verwenden will, dann muss man die automatische Generierung einer solchen ausschalten mit diesem manuellen Eintrag in der Projektdatei:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
...
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>

Die Registerkarte "Package" zeigt nunmehr gemischt Infos aus AssemblyInfo.cs und der Projektdatei, wobei die AssemblyInfo.cs Vorrang hat. Einige Information wie Tags und Author kann man aber in der AssemblyInfo.cs bisher leider nicht speichern.