> 文章列表 > C# 关于源代码生成

C# 关于源代码生成

C# 关于源代码生成

生成1:

步骤1:

首先建立一个控制台程序 SourceGeneratorDome1 选择版本.net7

代码如下:

// See https://aka.ms/new-console-template for more information
using GreetingTest;
Console.WriteLine("Hello, World!");
//Greeting.SayHelloTo("dyk");
les2_GreetingGeneratorMethod();
Console.ReadKey();static void les2_GreetingGeneratorMethod() => GreetingUsePartialClass.SayHelloTo1("dyk");

建立类文 件  GreetingUsePartialClassm 这是一个类分布文件。

看清楚哟。这里只是定义了一个分布类和分布方法。具体实现方法通过源代码生成

namespace GreetingTest;public static partial class GreetingUsePartialClass
{//public static void hello(string name)//{//    SayHelloTo1( name);//}public  static partial void SayHelloTo1(string name);
}

步骤2:建立一个源代码生成项目 但是类型选择. netstandard2.0  

项目名称:SourceGenerator.PartMethod

为什么选择. netstandard2.0 .主要是为了兼容性,因为其他版本可能生成代码用不了。或者出现一些莫名其妙问题。主要考虑代码向上兼容问题。

建立一个类文件 GreetingGeneratorMethod.cs 主要用于生成代码

注意:

1、[Generator(LanguageNames.CSharp)] 这个必须标识。否则不能生成代码。主要作用告诉编译器它要生成什么语言代码。这里是c# 也可以写成这样 [Generator("C#")]

2、.proj 必须加入 <LangVersion>preview</LangVersion> 否则告诉什么下面"""语法不支持

3、引入 Microsoft.CodeAnalysis.Common

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><LangVersion>preview</LangVersion></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.5.0" /></ItemGroup></Project>
namespace SourceGenerator.PartMethod
{/// <summary>/// 一定记得在项目配置文件加入///  <LangVersion>preview</LangVersion>///  否则会报错,AddSource 里字符串 什么语法7.3没法使用。///  [Generator(LanguageNames.CSharp)]  获取 [Generator("C#")]都可以。///  必须写则个特性。否则不会生成代码/// </summary>//[Generator("C#")][Generator(LanguageNames.CSharp)]public class GreetingGeneratorMethod : ISourceGenerator{public void Execute(GeneratorExecutionContext context){context.AddSource("GreetingUsePartialClass.g.cs",$$"""//告知编译器,该文件由源代码生成器或别的手段生成的代码//<auto-generated/>//启用可空性检查。为C# 8 提供特性#nullable enablenamespace GreetingTest;public static partial class GreetingUsePartialClass{public  static partial void SayHelloTo1(string name){global::System.Console.WriteLine($"Hello {name} 8886");}}""");}public void Initialize(GeneratorInitializationContext context){}}
}

建立一个全局应用文件:GlobilUsing.cs

当然也可以不建立,因为可以直接在上一个文件头部引入。全局引入是某个版本新语法

global using System;
global using Microsoft.CodeAnalysis;

到这里代码是可以生成了。

步骤3:调用生成代码

接下在控制台调用源代码生成的代码:

1、首先引入源代码项目

    <ProjectReference Include="..\\SourceGenerator.PartMethod\\SourceGenerator.PartMethod.csproj" OutputItemType="Analyzer" ReferenceOutAssembly="false" />

注意:

OutputItemType="Analyzer" :指定编译的词法分析类型

ReferenceOutAssembly="false":告诉编译器。要使用源代码生成代码。如果这里涉及不是源代码生成代码 设置为true就可以。

控制台.proj

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net7.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><ProjectReference Include="..\\SourceGenerator.PartMethod\\SourceGenerator.PartMethod.csproj" OutputItemType="Analyzer" ReferenceOutAssembly="false" /></ItemGroup></Project>

以上就可以做到,在控制台定义部分方法声明,然后让代码生成器去生成代码实现体。这是不是很方便。我们可以联想是不是可以用来做高级低代码编程工具啊。