C# 源代码生成器

这篇具有很好参考价值的文章主要介绍了C# 源代码生成器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是源生成器

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

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

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

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

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

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

Microsoft 文档模型图示

源生成器作为编译阶段运行
C# 源代码生成器

源生成器是由编译器与任何分析器一起加载的 .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 属性。

  • 运行结果
    C# 源代码生成器

  • 查看生成的代码
    C# 源代码生成器

结语

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

到了这里,关于C# 源代码生成器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 淘宝无痕下单生成器一拖多入口生成器(附api生成接口以代码)

    淘宝无痕下单生成器的用途是:通过无痕下单生成器生成的二维码,用户通过扫码直接无痕下单的,电商后台只显示成交,但是没有路径,什么都没有,没有痕迹,即使通过淘宝生意参谋流量路径、访客人数等数据都无法显示。可快速带动搜索权重,获得

    2024年02月12日
    浏览(150)
  • MyBatisPlus代码生成器使用

    无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,

    2024年02月03日
    浏览(59)
  • css在线代码生成器

    这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强大方式。 布局生成器https://layout.bradwoods.io/ CSS布局生

    2024年02月14日
    浏览(70)
  • 源生成器:根据需要自动生成机械重复代码

    本文概述了利用.NET Compiler Platform(“Roslyn”)SDK 附带的 源生成器 (Source Generator)自动生成机械重复的代码。关于这部分的基础入门知识可以在MSDN [1] 学到。 本文 默认 已经有一个解决方案,包含两个项目。一个是普通C#项目,依赖于另一个源生成器项目。 此处以 Dependenc

    2024年02月01日
    浏览(77)
  • 基于Velocity开发代码生成器

    一、引言 在项目开发中,我们有碰到大量的简单、重复的增删改查需求,通过阅读 若依 框架https://github.com/yangzongzhuan/RuoYi 的代码生成器实现,结合我项目所用的技术栈,开发出本项目的代码生成器。 二、Velocity 简单介绍 1、Velocity是一个基于Java的模板引擎,我们可以往C

    2024年02月15日
    浏览(60)
  • 又一款低代码生成器

    大家好,我是 Java陈序员 。 最近在浏览 Github 的时候,发现了一款简单好用的低代码生成器 maku-generator 。 无论是工作,还是接私活,这款低代码都能快速迭代出一个项目! 今天,分享给大家,强烈建议私有化部署! 关注微信公众号:【Java陈序员】,获取 开源项目分享、

    2024年04月10日
    浏览(61)
  • 若依笔记(四):代码生成器

    已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码,前提是数据库中有数据表,生成pojo类以及对于该数据表的增删改查命令的代码,若依更进一步能选择表后生成代码、预览、下载,同时可以生产前端代码,与后端一起还能实现权限管理和数据隔离

    2024年02月06日
    浏览(53)
  • 【若依】-代码生成器-微服务版本

    代码生成器可以快速的构建单表的CRUD操作,甚至提供了前端,可谓良心 说明:我默认你已经部署了微服务版本的若依项目,并将前后端已经运行 下面的内容是关于-单表CRUD-的代码生成器使用步骤 这里的表可以直接从若依的官网拿,改表名就可以,改一下表名,导入数据库

    2024年02月04日
    浏览(64)
  • Java-代码生成器的实现

    最近看了一个开源的项目, jfinal-layui ,然后这个项目里面有一个 代码生成器 的功能 之前虽然有用过代码生成器,但是从来没有看过相关的源码,所以就研究了一下,个人感觉这个项目的代码生成器还是蛮好的,能够根据指定的数据库和表生成前后端的代码,不过这个项目

    2024年02月02日
    浏览(63)
  • vuejs源码阅读之代码生成器

    代码生成器是模版编译的最后以后,它的作用是将AST转换成渲染函数中的内容,这个内容可以称为代码字符串。 代码字符串可以被包装在函数中执行,这个函数就是我们通常说的渲染函数。 渲染函数被执行之后,可以生成一份VNode,而虚拟DOM可以通过这个VNode来渲染视图。

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包