当前位置: 首页 > news >正文

实现“拼好库”,让你的 NuGet 包同时支持库调用和源生成器解析

实现“拼好库”,让你的 NuGet 包同时支持库调用和源生成器解析

CommunityToolkit.Mvvm 同时能够被调用和使用源生成器,但是它是如何实现的呢?本文将提供一个简单的教程。

一、省流

其实像 CommunityToolkit.Mvvm 这样的包看似是一个单独的包,其实是由两部分组成的。

一个项目是无法实现同时支持 API 调用和源生成器的,而实现它们的秘诀就是在 csproj 将两个项目“黏”起来。

示例源码:https://gitee.com/fanbal/pin_source_generator

二、准备“拼好库”

我们需要准备以下三个项目:

  1. 纯源生成器项目
  2. 纯类库项目
  3. 测试用的控制台(用来看我们的源生成器和类库载入是否生效了)

三、纯源生成器项目的大致代码

这个源生成器的功能是解析项目中名为 hello.txt 的附加文件(一定是附加文件!附加文件的概念在我们后面第五节有详细的说明),它会解析其中的文本,并生成一个对应文本作为类名的空的类,第五节我们可以看到相关的效果图。

我们把项目叫做:HelloGen

image

csproj的部分是这样的。

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules><AllowUnsafeBlocks>true</AllowUnsafeBlocks><IsRoslynComponent>true</IsRoslynComponent></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference><PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" PrivateAssets="all" /></ItemGroup></Project>

这个项目有且仅有一个源生成器:

using Microsoft.CodeAnalysis;
using System.IO;
using System.Linq;namespace HelloGen
{[Generator]public class OHHHGen : IIncrementalGenerator{public void Initialize(IncrementalGeneratorInitializationContext context){var hello = context.AdditionalTextsProvider.Where(i => Path.GetFileName(i.Path) == "hello.txt").Collect();context.RegisterSourceOutput(hello, (ctx, arr) =>{foreach (var item in arr){var text = item.GetText();ctx.AddSource($"{text}.g.cs", $"public class {text}{{public int OHHHHH = 0;}}");}});}}
}

四、纯类库的内容

我们的类库名为 HelloLib,它的结构也及其的简单。

image-1

其中,HelloClass 的内容实在是太简单了,就不另外贴代码了,各位看截图吧。

image-2

重点在于 csproj 的部分喵。

重点如下!

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework></PropertyGroup><ItemGroup><None Include="..\HelloGen\bin\$(Configuration)\netstandard2.0\HelloGen.dll"PackagePath="analyzers\dotnet\roslyn4.0\cs"Pack="true"Visible="false" /></ItemGroup>
</Project>

特别是其中的 <None Include="xxxx.dll" PackagePath="analyzers\dotnet\roslyn4.0\cs" Pack="true" Visible="false" /> 这一段。

这一段我是抄自 CommunityToolkit.Mvvm 的,实际上似乎 PackagePath="analyzers/dotnet/cs" 这样的写法也没有问题,可以参考 https://roslyn-analyzers.readthedocs.io/en/latest/create-nuget-package.html 上面的说法喵。

通过这个配置,你就可以将两者拼起来了。

当你完成了这两个之后你就可以导出成 NuGet 包了。
就像这样,至于是 Debug 还是 Release 无所谓的。

image-4

五、测试用的控制台

总之你要一个控制台,然后安装上我们的 NuGet 包,在我们项目就是 HelloLib

这是我们的结构。
image-5

1. 创建一个 hello.txt 的附加文件

总之你需要先放一个 hello.txt 在这里,然后,csproj 的地方你可以参考这个:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><AdditionalFiles Include="hello.txt" /></ItemGroup><ItemGroup><PackageReference Include="HelloLib" Version="1.0.0" /></ItemGroup></Project>

你有注意到 AdditionalFiles 那一块了吗?

文本的内容非常的简单:

image-6

简单的一句 HelloWorld。

2. 观察源生成器的反应

我们打开分析器,你可以发现这里有一个 HelloWorld.g.cs
image-7

生成的代码如下:

public class HelloWorld{public int OHHHHH = 0;}

3. 直接在代码中使用吧

image-8

你可以发现在智能提示中有自动生成的 HelloWorld 类,当然也包括来自纯类库的 HelloLib。

可喜可贺啊。我们也把代码也会贴到了 gitee 中哦。

六、总结

为了实现这样的“拼好库”,<None Include="xxxx.dll" PackagePath="analyzers\dotnet\roslyn4.0\cs" Pack="true" Visible="false" /> 这一段真的非常重要哦喵。

http://www.jsqmd.com/news/40040/

相关文章:

  • 2025年膜结构工程订做厂家权威推荐榜单:膜结构遮阳棚/膜结构汽车棚/膜结构景观棚源头厂家精选
  • [忘发了]P3710 方方方的数据结构
  • open-type=chooseAvatar
  • 2025年防洪松木桩批发厂家权威推荐榜单:河道木桩/6米松木桩/人工湖木桩源头厂家精选
  • 2025年口碑好的实木楼梯定制:十大品牌综合评测与选择指南
  • 仿手绘画流程图工具 excalidraw
  • 2025 养老保险规划公司最新推荐榜:国际测评认证优质企业,综合实力与服务竞争力深度解析
  • Java CountDownLatch
  • GEO:AI搜索时代的新增长方式,以及灵捷AI的实践路径
  • 详细介绍:JVM Java虚拟机
  • [电调]AM32电调调参系列 —— Active brake on stop power 和 Brake on stop的区别
  • 2025 最新车床厂家推荐榜:聚焦高精度智能设备,涵盖立式 / 双主轴 / 车铣复合等热门机型
  • 2025年工业用离心机源头厂家权威推荐榜单:过滤离心机/高钾离心机/自动卸料离心机实力厂家精选
  • 2025 最新表冷器源头厂家权威推荐榜:14 项专利加持 + 国际测评认证,锂电表冷器/钎焊板式换热表冷器/铜管串铝翅片表冷器公司推荐
  • N - 翻译布尔表达式
  • 2025年市场上桥洞力学板开发公司排名背后故事:技术与实力的深度解析
  • 2025年10月桥洞力学板公司口碑排行情况
  • 2025年重庆脊柱矫正服务权威推荐榜单:中医理疗/经络/正脊服务精选
  • 2025全球知名连接器品牌价值榜与中国企业崛起:十大品牌全景测评与选型指南
  • 大气模式
  • 2025年存包储物柜实力厂家权威推荐榜单:公共场所储物柜/酒店储物柜/超市储物柜源头厂家精选
  • C# PuppeteerSharp html转pdf
  • 大气环流模式
  • 2025年隔音净化板制造厂权威推荐榜单:电子厂净化板/保温净化板/抗静电净化板源头厂家精选
  • 2025年阻燃泡沫批发厂家权威推荐榜单:防水泡沫/密封海绵/阻燃棉源头厂家精选
  • 2025年青年旅舍太空舱源头厂家综合推荐:太空舱民宿/旅游太空舱民宿/景观移动太空舱酒店设备精选指南
  • 动态主机配置协议(DHCP)中的中继机制及其配置方法
  • 使用神经网络处理逻辑异或门问题
  • MATLAB实现光谱特征波长提取
  • 支持服务器的文件同步软件提升数据管理效率