添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

注意: 坑极多。而且截至2023年,这个东西仅仅是半成品

利用SourceGenerator可以在编译结束前生成一些代码参与编译,比如编译时反射之类的,还有模板代码生成都很好用。

演示仓库传送门-Github-yueh0607

1. 创建项目

我们需要两个项目,创建完如下

  1. 类库项目(用作生成器)( 注意只能是.NET Standard 2.0 ,别的无效)
  2. 控制台项目(用来测试)( 至少是.NET 5.0 或者以上,建议是6,7)
    在这里插入图片描述

2.安装CodeAnalysis.Common包

在这里插入图片描述
注意:这个包是依赖Roslyn编译器的,所以 请把VisualStudio更新到最新 ,这一点相当重要,或者你自行保证 编译器版本符合这个Nuget包的要求,如果不符合,在VS的警告里会发出提示。

严重性 说明 行
警告 分析器程序集“X:\Projects\ImportantProjects\SourceGenTest\SourceGen\bin\Debug\netstandard2.0\SourceGen.dll”引用了编译器的版本“4.6.0.0”,该版本高于当前正在运行的版本“4.4.0.0”。 1

3.写生成器

  1. 注意要 实现ISourceGenerator接口
  2. 加上特性Generator (可以不写参数,也可以写"C#",或者我这么写也行)
  3. 尽量使用完全限定来防止名称冲突,global能进一步防止撞名字
  4. 使用"""三个引号能写格式化代码,很方便
  5. 记得打上特性标记代码由编译器生成,而非用户生成或者书写的,防止被滥用
using Microsoft.CodeAnalysis;
namespace SourceGen
    [Generator(LanguageNames.CSharp)]
    public sealed class HelloWorldGenerator : ISourceGenerator
        void ISourceGenerator.Execute(GeneratorExecutionContext context)
            const string version = "1.0";
            context.AddSource("TestFile.cs",
                $$"""
                //<auto-generated/>
                #nullable enable
                namespace GenCode
                    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{nameof(HelloWorldGenerator)}}","{{version}}")]
                    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
                    public static class GeneraredClass
                        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{nameof(HelloWorldGenerator)}}","{{version}}")]
                        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
                        public static void Hello()
                            global::System.Console.WriteLine("代码生成成功");
        //初始化,可以写一些筛选条件之类的
        void ISourceGenerator.Initialize(GeneratorInitializationContext context)

在这里插入图片描述
写完就出警告了,在生成器项目需要添加Enforce…加上就OK了
在这里插入图片描述

4.引用生成器

在这里插入图片描述
在这里插入图片描述
引用完之后,在ItemGroup里只有Include,手动加上后两项。注意不要写错字母

注意本文内使用的C#版本较高,可能需要手动打开preview模式
在这里插入图片描述
在这里插入图片描述

生成器每次改动都需要重新生成这个项目!!!,建议第一次也重新生成

5.玄学施法时刻

重启VS
在这里插入图片描述
在这里插入图片描述
这样测试项目里就生成完毕了

  • LeetCode-116-填充每个节点的下一个右侧节点指针
  • 5、排序算法
  • Spring学习笔记,包含Spring IOC、AOP基本原理、Bean管理、Spring 事务等等
  • torch使用GPU加速
  • 深入理解CSS| 青训营
  • iOS - Apple开发者账户添加新测试设备
  • VUE3-03
  • Meta-Transformer 多模态学习的统一框架
  • Ae 效果:CC Toner
  • html/javascript-表格的创建和使用
  • lombok使用
  • 关于质数筛——数论
  • formatter的用法,深拷贝, Object.assign 方法实战。
  • MySQL Windows版本下载及安装时默认路径的修改
  • vue卡槽
  • HTTP改HTTPS
  • 【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块5
  • 【业务功能篇58】Springboot + Spring Security 权限管理 【中篇】
  •