Wissen von A bis Z

Source Generators

Source Generators schreiben den Code für Sie, während Sie ihn gerade erst kompilieren – fast wie ein magischer Ghostwriter für Ihren Compiler.

Source Generators sind eine mit C# 9 / .NET 5 (2020) eingeführte Roslyn-Erweiterung, mit der Compile-Zeit-Code-Generierung Bestandteil der regulären C#-Build-Pipeline geworden ist. Ein Source Generator inspiziert während der Kompilierung das Syntax-Modell des aktuellen Projekts und kann zusätzlichen C#-Quellcode in den Compile-Vorgang einfügen, ohne dass externe Build-Schritte oder Code-Manipulationswerkzeuge nötig sind.

Eingesetzt werden Source Generators für eine wachsende Liste von Aufgaben: System.Text.Json nutzt sie für AOT-taugliche, allokationsfreie Serializer (JsonSerializerContext); Microsoft.Extensions.Logging für hochoptimierte Log-Methoden (LoggerMessage); ASP.NET Core und Minimal APIs für OpenAPI- und Routing-Generatoren; Frameworks wie MediatR, MAUI, NLog, Refit und viele andere für Boilerplate-Reduktion. Entwickler eigener Generators implementieren typischerweise das Interface IIncrementalGenerator und schreiben damit hochperformante, deklarative Code-Erweiterungen.

Der Einsatzzweck und das gelöste Problem liegen in der Spannung zwischen Reflection-basiertem Magic-Code und nativer Performance bzw. AOT-Tauglichkeit. Reflection ist flexibel, aber langsam und mit Native AOT/Trimming nur eingeschränkt vereinbar. Source Generators verschieben das ‚Magic' von der Laufzeit auf die Compile-Zeit: Statt zur Laufzeit über Reflection Methoden aufzurufen, wird zur Compile-Zeit der entsprechende konkrete Code erzeugt — debugbar, optimierbar und AOT-fähig.

Historisch knüpfen Source Generators an ältere Mechanismen an (T4-Templates, Roslyn-CodeFix-APIs, IL-Weaving-Bibliotheken wie Fody) und ersetzen diese in den meisten Szenarien. Mit der Einführung von Incremental Generators in .NET 6 wurde das Modell so weit verbessert, dass auch große Lösungen mit vielen Generatoren in der IDE flüssig bleiben — ein zentrales Problem der ersten Generation.

Eingeführt wurden Source Generators vom Roslyn- und C#-Team, federführend Andy Gocke, Jared Parsons und Chuck Lillie. System.Text.Json war eines der ersten Frameworks, das die neue Möglichkeit produktiv nutzte. Stephen Toub hat in seinen Performance-Posts dokumentiert, wie der Source-Generator-basierte Pfad in JSON-Serialisierung in vielen Szenarien deutlich schneller, allokationsärmer und AOT-tauglicher ist als der reflectionbasierte Pfad — heute ein Paradebeispiel dafür, wie Compile-Zeit-Metaprogrammierung produktive Reife erreicht hat.

Bei bluehands setzten wir die SourceGeneratoren sehr intensive ein. Insbesondere in Migrationsstrategien sind die SourceGeneratoren unverzichtbar.

Zurück