當前位置: 妍妍網 > 碼農

.Net Core 你必須知道的source-generators

2024-03-17碼農

源生成器是 C# 9 中引入的一項功能,允許在編譯過程中 動態生成程式碼

它們直接與 C# 編譯器整合(Roslyn)並在編譯時執行,分析原始碼並根據分析結果 生成附加程式碼

源生成器提供了一種簡化的自動化程式碼生成方法,無需外部工具或單獨的預編譯步驟。

透過無縫整合到編譯過程中,源生成器可以提高生產力、減少錯誤並實作更高效的開發工作流程。

如何使用

建立 .NET 控制台應用程式。此範例使用 .NET 6。將 Program 類替換為以下程式碼。

namespaceConsoleApp;partial classProgram{staticvoidMain(string[] args) { HelloFrom("Generated Code"); }staticpartialvoidHelloFrom(string name);}

接下來,我們將建立一個源生成器計畫來實作 partial void HelloFrom 方法對應項。

建立一個以 netstandard2.0 目標框架名字物件為目標的 .NET 類別庫。添加以下 NuGet 包

<ItemGroup><PackageReferenceInclude="Microsoft.CodeAnalysis.CSharp"Version="4.8.0"PrivateAssets="all" /><PackageReferenceInclude="Microsoft.CodeAnalysis.Analyzers"Version="3.3.4"PrivateAssets="all" /></ItemGroup>

然後,建立一個名為 HelloS ourceGenerator.cs 的新 C# 檔,該檔指定你自己的源生成器,如下所示:

using Microsoft.CodeAnalysis;namespaceSourceGeneratorInCSharp{ [Generator]public classSourceGenerator : ISourceGenerator {publicvoidExecute(GeneratorExecutionContext context) {// Find the main methodvar mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken);// Build up the source codestring source = $@"// <auto-generated/>using System;namespace {mainMethod.ContainingNamespace.ToDisplayString()}{{ public static partial class {mainMethod.ContainingType.Name} {{ static partial void HelloFrom(string name) => Console.WriteLine($""Generator says: Hi from '{{name}}'""); }}}}";var typeName = mainMethod.ContainingType.Name;// Add the source code to the compilation context.AddSource($"{typeName}.g.cs", source); }publicvoidInitialize(GeneratorInitializationContext context) {// No initialization required for this one } }}

現在,我們有一個正常執行的生成器,但需要將其參照到控制台應用程式。

新參照不是傳統的計畫參照,必須手動編輯以包含 OutputItemType 和 ReferenceOutputAssembly 內容。

<ItemGroup><ProjectReferenceInclude="..\SourceGeneratorInCSharp\SourceGeneratorInCSharp.csproj"OutputItemType="Analyzer"ReferenceOutputAssembly="false" /></ItemGroup>

現在,執行控制台應用程式時,應會看到生成的程式碼執行並打印到螢幕。

控制台應用程式本身不實作 HelloFrom 方法,而是在編譯過程中從源生成器計畫生成的源。

如果使用的是 Visual Studio,則可以看到源生成的檔。

在「解決方案檔案總管」視窗中,展開「依賴項」>「分析器」>「SourceGenerator」>「SourceGenerator.HelloSourceGenerator」,然後雙擊「Program.g.cs」檔即可看到生成的內容。

https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/source-generators-overview

關註我獲取技術分享