首页 > 其他分享 >.Net Core 你必须知道的source-generators

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

时间:2024-03-16 09:00:56浏览次数:22  
标签:Core partial HelloFrom void 生成器 source generators context

源生成器是 C# 9 中引入的一项功能,允许在编译过程中动态生成代码

它们直接与 C# 编译器集成(Roslyn)并在编译时运行,分析源代码并根据分析结果生成附加代码

源生成器提供了一种简化的自动化代码生成方法,无需外部工具或单独的预编译步骤。

通过无缝集成到编译过程中,源生成器可以提高生产力、减少错误并实现更高效的开发工作流程。

 

如何使用

创建 .NET 控制台应用程序。 此示例使用 .NET 6。将 Program 类替换为以下代码。 

namespace ConsoleApp;

partial class Program
{
    static void Main(string[] args)
    {
        HelloFrom("Generated Code");
    }

    static partial void HelloFrom(string name);
}

接下来,我们将创建一个源生成器项目来实现 partial void HelloFrom 方法对应项。

创建一个以 netstandard2.0 目标框架名字对象为目标的 .NET 类库。 添加以下 NuGet 包

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

 

然后,创建一个名为 HelloSourceGenerator.cs 的新 C# 文件,该文件指定你自己的源生成器,如下所示:

using Microsoft.CodeAnalysis;

namespace SourceGeneratorInCSharp
{
    [Generator]
    public class SourceGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            // Find the main method
            var mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken);

            // Build up the source code
            string 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);
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            // No initialization required for this one
        }
    }
}

 

现在,我们有一个正常运行的生成器,但需要将其引用到控制台应用程序。 

新引用不是传统的项目引用,必须手动编辑以包含 OutputItemType 和 ReferenceOutputAssembly 属性。

<ItemGroup>
    <ProjectReference Include="..\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

 

标签:Core,partial,HelloFrom,void,生成器,source,generators,context
From: https://www.cnblogs.com/chenyishi/p/18073694

相关文章

  • 【spring】@PropertySource 注解学习
    @PropertySource介绍@PropertySource是Spring框架中的一个注解,主要用于Java配置类中,用于引入额外的属性文件,以便在Spring应用上下文中使用这些属性。在Spring3.1引入Java配置后,我们可以通过@Configuration注解的类和@Bean注解的方法来进行组件扫描和依赖注入配置。但是,对于......
  • AspNetCore8.0实战
    前言想变优秀的第N天。学习张老师的Blog.Core。1.创建Asp.NetCoreAPI1.1创建项目启用OpenAPI:sawgger不适用顶级语句:使用main函数使用控制器:controller1.2配置说明iisSettings:iis配置。http:kestrl启动配置。IISExpress:iis启动配置。2.仓储+服务创建以下公共类......
  • SourceTree提示Authentication failed for 如何解决
    sourcetree拉取失败提示Authenticationfailed(下图)1、关闭sourcetree;2、打开文件目录C:\Users\****\AppData\Local\Atlassian\SourceTree,删除passwd文件;3、打开sourcetree,点击拉取,就会弹出身份验证窗口,输入完成点击login即可拉取成功; ......
  • .NetCore Web Api 项目Docker部署
    .NetCoreWebApi项目Docker部署.Net5之后版本编写的项目代码编译后均可以分别部署在Windows、Linux系统下。只需要安装对应的SDK或者运行时。这篇文章主要介绍.Net项目编译之后通过docker镜像部署WebApi项目了解dotnet命令dotnet命令详细说明链接。不得不说微软的文档......
  • DiagnosticSource DiagnosticListener 无侵入式分布式跟踪
    ASP.NETCore中的框架中发出大量诊断事件,包括当前请求进入请求完成事件,HttpClient发出收到与响应,EFCore查询等等。我们可以利用DiagnosticListener来选择性地监听这些事件,然后通过自己的方式组织这些日志,实现无侵入的分布式跟踪。下面我们通过DiagnosticSource监听EFCore,与HTTP......
  • Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
    简介https://www.hangfire.io/在.NET和.NETCore应用程序中执行后台处理的简单方法,无需Windows服务或单独的进程。Hangfire是一个开源的.NET任务调度框架,它提供了内置集成化的控制台,允许用户直观明了地查看作业调度情况。Hangfire不需要依赖于单独的应用程序执行(如Wi......
  • .Net Core 依赖注入DI
    一、依赖注入(DI)定义    依赖注入(DependencyInjection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系。它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直接创建依赖对象。   它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩......
  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
    1、前言为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以就想着将这些功能......
  • .NET CORE微服务之Polly
     概念Polly是一个被.net基金会支持认可的框架,Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达策略,如重试、断路器、超时、舱壁隔离和回退。Polly的7种策略Polly是一个.NETCore中的弹性和瞬态故障处理库,它提供了多种策略来处理服务故障,确保系......
  • C#/.NET/.NET Core拾遗补漏合集(持续更新)
    前言在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NETCore拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。GitHub开源地址https://github.com/Y......