"Mastering Source Generators", Vladislav Antonyuk.pptx

fwdays 81 views 12 slides Jul 20, 2024
Slide 1
Slide 1 of 12
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12

About This Presentation

The presentation is devoted to Source Generators. Why they appeared, what problems they solved, and what opportunities they opened up for developers. In addition, we will discuss real examples of the use of Source Generators in various projects and share best practices for their implementation in ev...


Slide Content

Speaker / 2 Vladislav Antonyuk Senior .NET Developer Microsoft MVP .NET MAUI Community Toolkit Core Maintainer https://vladislavantonyuk.github.io https://www.linkedin.com/in/vladislav-antonyuk/ https://youtube.com/@VladislavAntonyuk

Source Generators / 3 Source Generators is a Roslyn compiler feature introduced in .NET 5. Source generators perform code generation at compile time, providing the ability to add source code to your project automatically. Compilation Runs Source Generator Step of Compilation Generated Source Code added as a Input to Compilation Compilation Resumes Source Generator Analyze Source Code Generate New Source Code

Common Scenarios / 4 Runtime Reflection Juggling MSBuild Tasks Intermediate Language (IL) Weaving 1 2 3

Where can I use them? / 5 Dependency Injection (IoC Container) Ma p pers Enums CSharp Source Generators Link

Demo

Cacheability is the Most Important Factor / 7 ForAtributeWithMetadataName() Select() RegisterSourceOutput() 1. On the first execution, all of the stages execute, and the intermediate results are cached enumDetails valuesToGenerate 2. New sources are gen e rated a nd added to the out put [EnumExtensions] public enum MyEnum { First Second, } ForAtributeWithMetadataName() Select() RegisterSourceOutput() Generated Source 4. The first stage executes, but it produces the same outputs as the first run enumDetails valuesToGenerate 6. Similarly, generation can be skipped because the outputs  are the same [EnumExtensions] public enum MyEnum { First Second, } Public class O ther {} 5. As the inputs are the same, the next stage is skipped, as it can use the cached outputs 3. The user edits their code, adding an unrelated class  ForAtributeWithMetadataName() Select() Generated Source 8. The first stage executes, but this time produces different outputs enumDetails valuesToGenerate [EnumExtensions] public enum MyEnum { First Second, Third } Public class O ther {} 9. As the input is different, the next stage must execute and produces different output 7. The user edits their code, adding a new enum value  RegisterSourceOutput() Generated Source

Benchmark Results / 8

Scripty Source Generators Alternatives / 9 T4 1 2 <#@ template hostspecific ="false" language="C#" #> <#@ output extension=".txt" #> <#int top = 10; for (int i = 0; i <=top; i ++) { #> The square of <#= i #> is <#= i * i #> <# } #> // TestScript.csx #load " TestCSharpFile.csx.cs " var sc = new ScriptContainer (Context); await sc.OutputProjectStructure (); Fody 3 <Weavers> < NullGuard IncludeDebugAssert ="false" /> < PropertyChanged /> </Weavers>

References / 10 R1 https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview R2 https://andrewlock.net/series/creating-a-source-generator/ R 3 https://github.com/amis92/csharp-source-generators R 4 https://github.com/VladislavAntonyuk/SourceGeneratorsDemo

Try your luck in Quiz! / 11 We invite you to participate in our quiz and win prizes . Test your knowledge of .NET, provide the correct answers, and take part in the raffle for: ✅ an EcoFlow charging station for the first place, ✅ a power bank and a water bottle from DataArt for the second place, ✅ and a backpack for the third place. Good luck ➡️

Thank You!