C# 源代码生成器

article/2025/10/12 12:11:35

C# 源代码生成器

  • 什么是源生成器
  • 源生成器允许执行两个主要操作
  • Microsoft 文档模型图示
  • 常见方案
  • 源生成器的使用
    • 1、创建 .NET控制台应用程序
    • 2、创建源生成器项目
    • 3、在控制台程序中使用生成器项目
  • 结语

什么是源生成器

源生成器是由.NET Compiler Platform(“Roslyn”)SDK 附带。
通过源生成器,C# 开发人员可以在编译用户代码时检查用户代码。 生成器可以动态创建新的 C# 源文件,这些文件将添加到用户的编译中。 这样,代码可以在编译期间运行。 它会检查你的程序以生成与其余代码一起编译的其他源文件

  • 源生成器是 C# 开发人员可以编写的一种新组件

源生成器允许执行两个主要操作

1、检索表示正在编译的所有用户代码的编译对象。 可以检查此对象,并且可以编写适用于正在编译的代码的语法和语义模型的代码,就像现在使用分析器一样。

2、生成可在编译过程中添加到编译对象的 C# 源文件。 也就是说,在编译代码时,可以提供其他源代码作为编译的输入。

结合使用这两项操作能充分发挥源生成器的强大功能。 可以使用编译器在编译时构建的丰富元数据检查用户代码。 然后,生成器将 C# 代码发送回基于已分析数据的同一编译。 如果你熟悉 Roslyn 分析器,可以将源生成器视为可发出 C# 源代码的分析器。

Microsoft 文档模型图示

源生成器作为编译阶段运行
Microsoft图示

源生成器是由编译器与任何分析器一起加载的 .NET Standard 2.0 程序集。 它在可以加载和运行 .NET Standard 组件的环境中使用。

目前只有 .NET Standard 2.0 程序集可以用作源生成器。

常见方案

  • 运行时反射
  • 处理 MSBuild 任务
  • 交织中间语言 (IL)

可用于检查用户代码,并基于当今技术所使用的分析生成信息或代码。
详细内容参考Microsoft 文档

源生成器的使用

1、创建 .NET控制台应用程序

不使用顶级语句, 经典格式是必需的

强行使用顶级语句会报:
错误 CS0759 没有为分部方法“Program.HelloFrom(string)”的实现声明找到定义声明
方法未声明的错误

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

2、创建源生成器项目

引入NuGet包:
Microsoft.CodeAnalysis.CSharp
Microsoft.CodeAnalysis.Analyzers

继承 ISourceGenerator 并实现接口方法,也要为实现类添加[Generator]特性支持

using Microsoft.CodeAnalysis;
using System.Diagnostics;namespace HelloSourceCode
{[Generator]public class HelloSourceGenerator : ISourceGenerator{public void Execute(GeneratorExecutionContext context){// 找到主方法var mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken);// 构建源代码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;// 将源代码添加到编译中context.AddSource($"{typeName}.g.cs", source);}public void Initialize(GeneratorInitializationContext context){// 不需要初始化// 附加调试器进程//if (!Debugger.IsAttached)//{//    Debugger.Launch();//}}}
}

context 对象中,我们可以访问编译的入口点或 Main 方法。 mainMethod 实例是一个 IMethodSymbol,它表示一个方法或类似方法的符号(包括构造函数、析构函数、运算符或属性/事件访问器)。 Microsoft.CodeAnalysis.Compilation.GetEntryPoint 方法返回程序的入口点的 IMethodSymbol。 其他方法使你可以查找项目中的任何方法符号。 在此对象中,我们可以推理包含的命名空间(如果存在)和类型。 此示例中的 source 是一个内插字符串,它对要生成的源代码进行模板化,其中内插的缺口填充了包含的命名空间和类型信息。 使用提示名称将 source 添加到 context。 对于此示例,生成器创建一个新的生成的源文件,其中包含控制台应用程序中 partial 方法的实现。 可以编写源生成器来添加任何喜欢的源。

GeneratorExecutionContext.AddSource 方法中的 hintName 参数可以是任何唯一名称。 通常为该名称提供显式 C# 文件扩展名,例如 ".g.cs"".generated.cs"。 该文件名有助于将文件标识为正在生成源。

关于 Initialize 方法一般是不用初始化的,上面可以看到我是写了一段代码的,作用是进入调试,这样做的主要原因是,不进行附加是无法进行调试的

3、在控制台程序中使用生成器项目

<ItemGroup><ProjectReference Include="..\HelloSourceCode\HelloSourceCode.csproj"OutputItemType="Analyzer"ReferenceOutputAssembly="false" />
</ItemGroup>

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

  • 运行结果
    运行结果

  • 查看生成的代码
    查看生成的代码

结语

本文学术内容皆引用于 Microsoft 文档
部分详细内容,本篇不再说明,Microsoft 文档说得很明确:文档地址
https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/


http://chatgpt.dhexx.cn/article/5538KSRA.shtml

相关文章

vue代码生成器

直接根据swagger api生成vue代码 前要 目前的代码生成器基本上是基于数据库表格来生成对应的前后台代码&#xff0c;好处是前后台一次性搞定&#xff0e;但实际开发中&#xff0c;很多的业务是需要连表的&#xff0c;所以这种情况来说&#xff0c;根据接口直接生成前代码&#…

C#代码生成器

引言 引言&#xff1a;随着.net Core 的不断发展&#xff0c;它也是一个成熟的平台了&#xff0c;鲁迅说过&#xff1a;成熟的平台就要学会自己写代码&#xff0c;那么今天我就在这里教大家如何让.net Core学会自己写代码。 提示&#xff1a;如果只是向往&#xff0c;远方依旧…

MybatisPlus代码生成器

代码生成器 问题导入 如果只给一张表的字段信息&#xff0c;能够推演出Domain、Dao层的代码&#xff1f; 1. MyBatisPlus提供模板 Mapper接口模板 实体对象类模板 2. 工程搭建和基本代码编写 第一步&#xff1a;创建SpringBoot工程&#xff0c;添加代码生成器相关依赖&…

python 代码生成器_Python代码生成器(代码生成工具)V1.1 正式版

Python代码生成器(代码生成工具)是一款很优秀好用的为新手制作的代码生成助手。小编带来的这款Python代码生成器功能强大&#xff0c;操作简单&#xff0c;使用后可以帮助用户更轻松便捷的生成Python代码&#xff0c;非常方便实用。其内置了大量的示例代码&#xff0c;可以帮助…

12款AI代码生成工具,都很能打

1.Anania Anania 是一个机器人数据分析师&#xff0c;可以通过简单、自然的英语对话来分析您的数据。连接数据源并以简单的英语提问&#xff0c;无需任何设置或配置。在幕后&#xff0c;Anania 正在使用一个 AI 系统&#xff0c;该系统将文本转换为 SQL 和 Python 代码并执行您…

3D相册动态桌面制作

3D相册动态桌面制作 1.下载3D相册代码链接&#xff1a;https://pan.baidu.com/s/1Z_br3XKGsW3vsISvSCteJA&#xff0c;提取码&#xff1a;8888 更换自己喜欢的图片 注意第三张和第四章相册右键旋转照片 直接双击运行index.html可以在浏览器中看到效果。 如果不是很喜欢 可以自行…

HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看

这是程序员表白系列中的100款网站表白之一&#xff0c;旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站&#xff0c;可以任意修改和使用&#xff0c;很多人会希望向心爱的男孩女孩告白&#xff0c;生性腼腆的人即使那个TA站在眼前都不敢向前表白…

制作简易的3D相册

今天介绍一下3D相册&#xff0c;用到了开源的FeatureCoverFlow控件&#xff0c;之前的几个作品用的也全都是开源的控件&#xff0c;为什么要用开源的控件呢&#xff0c;因为...他稳定啊&#xff01; 1.准备 仍然是&#xff0c;去掉标题栏&#xff0c;然后导库&#xff1a; impl…

HTML5、css3、js实现3D相册

目录 想法 实现 一、基础知识 1.3D转换 transform-style: preserve-3d; ①简述 ②使用 ③3D转换方法 2.onmouseover 事件 ①解释 ②具体语法 3.onmouseout事件 ①解释 ②具体语法 **本例通过在div的class中设置相同的类名&#xff0c;然后在js方法中通过document…

前端CSS3实现3D相册小案例

前端CSS3实现3D相册小案例 HTML代码部分&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>3D相册</title> <link type"text/css" href"css/style.css&qu…

制作一个简单3D相册

- 用到的点&#xff1a; 旋转 2D 旋转 transform: rotate(值deg) deg 角度的单位 3D 旋转 transform:rotateX rotateY roteteZ 如果让一个块实现3D效果&#xff0c;必须做两件事&#xff1a; 1、在要实现3D效果的块上 加transform-style:preserve-3D (声明) 2、在要实现3D效…

html结合css实现浏览器展示3D相册

最近写了一个在浏览器展示3D相册效果&#xff0c;通过html文件结合css实现。 1.html详细代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>3D相册</title> <script src"../js/jquer…

python3d相册源代码_js和CSS3炫酷3D相册展示

js和CSS3炫酷3D相册展示 *{margin:0;padding:0;} body{background:url(img/bg.jpg);width:100%;height:100%;overflow:hidden;}; h1{width:277;height:76px;margin:30px auto 0;} .xc-3D{width:100%;height:300px;background:#fff;margin-top:100px;position:relative;transfor…

three.js 制作3D相册

效果图&#xff1a; 由于博客限制了图片大小&#xff0c;动画质量不太好&#xff0c; 在线效果&#xff1a; https://static-mp-df787464-d77c-4180-83c3-6e7add40073e.next.bspapp.com/ 参考了three.js 官方代码 <!-- 源码下载地址 https://pan.baidu.com/s/1AVB71Aj…

3d相册

页面脚本 我的图片是是本地的&#xff0c;大家可以放上自己喜爱的图片 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>3d相册</title></head><style>#box1 {/* 宽 */width: 300px;/* 高 */height: …

HTML实现3D相册

今天&#xff0c;我给大家分享一个3D相册的代码 废话不说先上效果图&#xff1a; 先新建两个文件夹&#xff0c;一个叫css&#xff0c;另一个叫img&#xff0c;如下图&#xff1a; 先新建一个文本文档&#xff0c;输入下面的代码&#xff1a; <!DOCTYPE html> <html…

教你零基础制作3D旋转相册(送给那个她~)

3D立体相册&#xff1f;   是的&#xff0c;相信大家或多或少的会在一些地方看到某些程序员用代码给自己女朋友写3D立体相册&#xff0c;那么你会不会也想自己手动敲出那些炫酷的代码呢&#xff1f;   那你是找对地方了。废话不多说&#xff0c;今天为大家分享利用html实现…

【3D相册】零基础完成3D相册并配上背景音乐

文章目录 一、前言二、准备工作1、新建文件夹2、准备素材对于图片的处理对于音乐的处理 三、代码工作1、python处理6张图片1.1代码运行1.2 放入背景图片 2、写html文件2.1 更换音乐素材 3、运行main.html 四、推荐阅读 一、前言 帮助好哥们整的一个小相册&#xff0c;给他写个…

斐波那契数列求和公式

斐波那契数列指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、……    这个数列从第三项开始&#xff0c;每一项都等于前两项之和。它的通项公式为:(见下图)&#xff08;又叫“比内公式”&#xff0c;是用无理数表示有理数的一个范例。&#xff09; 斐波那契数列求…

斐波那契数列之python(5种方法)

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、因数学家列昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;1、1、2、…