您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。
摘要:C#9 引入了一个强大的机制:源生成器(Source Generator)。通过创建源生成器,我们可以简化大量重复编写的代码,或是减少反射来获得更强的性能以及AOT支持 本文将介绍如何从零开始创建一个最简单的源生成器 创建生成器项目 创建一
C#9 引入了一个强大的机制:源生成器(Source Generator)。通过创建源生成器,我们可以简化大量重复编写的代码,或是减少反射来获得更强的性能以及AOT支持
本文将介绍如何从零开始创建一个最简单的源生成器
创建生成器项目
创建一个SourceGeneratorDemo.Generator项目,目标框架需要设置为.NET Standard 2.0
这大概由于Visual Studio尚未迁移到.NET Core,Framework最高支持.NET Standard 2.0的项目
添加Microsoft.CodeAnalysis.Analyzers、Microsoft.CodeAnalysis.CSharp的nuget引用。
添加EnForceExtendedAnalyzerRules属性,强制禁用一些分析器不适用的API,否则IDE会有警告
(此属性的具体作用可以看lindexi大佬的这篇文章)
<PropertyGroup>
...
<EnForceExtendedAnalyzerRules>true</EnForceExtendedAnalyzerRules>
</PropertyGroup>
最终csproj文件如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<EnForceExtendedAnalyzerRules>true</EnForceExtendedAnalyzerRules>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="4.14.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
</ItemGroup>
</Project>
编写源生成器
创建SampleGenerator.cs,添加[Generator]特性并实现IIncrementalGenerator接口
旧的源生成器ISourceGenerator在每次代码有更改时都会扫描整个语法树,开销很大。而新的增量生成器IIncrementalGenerator通过管道等方式遴选需要扫描的代码,大大减少生成开销。
