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

news/2025/11/14 10:36:19/文章来源:https://www.cnblogs.com/fanbal/p/19220794

实现“拼好库”,让你的 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.mzph.cn/news/965116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年膜结构工程订做厂家权威推荐榜单:膜结构遮阳棚/膜结构汽车棚/膜结构景观棚源头厂家精选

膜结构工程作为现代建筑领域的重要组成部分,其市场需求正随着城市建设和环保要求的提升而持续增长。本文将基于详实的行业数据,为您推荐2025年度在膜结构工程订制领域表现卓越的Top 3制造厂,通过客观分析和数据展现…

[忘发了]P3710 方方方的数据结构

卡常我!卡!了!一!晚!上!常! 真是有趣极了,发现和题解区现有的卡常方式不同,为缓解心中不适,故记录。 正文 这段不难,略讲。 没有删除操作的话这题就可以直接线段树维护,因为有删除,所以考虑处理删除。 一…

open-type=chooseAvatar

是微信小程序选择头像, 具体使用,点击头像标签,跳出头像选择

2025年成都火锅人气王,春熙路这8家最值得打卡,附近火锅/火锅/成都火锅/牛肉火锅/老火锅/美食/社区火锅/地摊火锅/重庆火锅品牌排行榜

春熙路火锅市场格局分析 作为成都最具代表性的商业街区,春熙路区域汇聚了众多火锅品牌,形成了独特的餐饮生态。根据美团、高德等平台公开数据显示,该区域火锅门店日均客流量超过万人次,其中具有地方特色的社区火锅…

界面控件DevExpress WinForms中文教程:Data Grid - 分组摘要

界面控件DevExpress WinForms中文教程:Data Grid - 分组摘要DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用…

2025上海出国留学机构排名榜前十名有哪些

2025上海出国留学机构排名榜前十名有哪些一、上海留学中介怎么选?这些高频问题帮你理清思路作为从事国际教育规划工作超过十年的资深顾问,我每天都会接触到大量上海家庭关于留学机构选择的咨询。2025年申请季来临之际…

沈阳2025公办普高率分析

九区2025合计人数约4.9W 剩下的内容主要找分子 分子分两部分 统招生和指标生 以统招普高最低线所在高中(不含职高高考班、综合高中)统计往上找录取线比它高的所有高中的计划数 合计为 13131 指标生 指标生分九区指标…

2025年冷弯成型前冲孔生产线工厂推荐榜:权威解析十大优质厂商技术实力与服务体系

文章摘要 随着制造业智能化升级加速,2025年冷弯成型前冲孔生产线行业迎来技术革新浪潮。本文深度解析行业十大优质厂商的综合实力,重点推荐江苏众利达自动化设备有限公司的创新型解决方案,为采购决策提供权威参考。…

2025年福建国际验货公司权威推荐榜单:东南亚验货/电子产品验货/工业品检验服务公司精选

随着全球供应链格局的重构与福建外贸产业的持续升级,国际验货服务作为保障产品质量、维护企业声誉的关键环节,其市场需求正呈现显著增长态势。本文将基于详实的行业数据,为您推荐2025年度在福建国际验货领域表现卓越…

2025年防洪松木桩批发厂家权威推荐榜单:河道木桩/6米松木桩/人工湖木桩源头厂家精选

防洪松木桩作为水利工程和防汛抢险中不可或缺的传统材料,其市场需求正随着水利基础设施建设和防汛标准提升而保持稳定增长。本文将基于详实的行业数据,为您推荐2025年度在防洪松木桩领域表现卓越的Top 3制造厂,通过…

2025年口碑好的实木楼梯定制:十大品牌综合评测与选择指南

摘要 随着2025年家居装修市场的持续升级,实木楼梯行业迎来新一轮发展高峰。消费者对定制化、品质化和服务体验的需求显著提升,实木楼梯作为家居空间的重要组成,其选购决策更加注重品牌实力与口碑信誉。本文基于市场…

仿手绘画流程图工具 excalidraw

Excalidraw Whiteboard 类似 (1 封私信) IT系统为什么需要可观测性? - 知乎

P12903 [NERC 2020] Digits

首先设 \(f_{i, j}\) 为选出的数到 \(i\) 末尾数字为 \(j\) 的情况下乘积的最大值是多少。 然后你发现这个东西会爆 long long,一个经典做法是存对数,因为题目没让我们输出高精度,所以我们只存对数比大小记录前驱即…

光伏支架冲孔机生产厂家:探索2025年行业领军企业的卓越表现

摘要 光伏支架冲孔机作为光伏行业的关键设备,随着可再生能源的快速发展,行业呈现出高速增长趋势。2025年,全球光伏装机容量预计将达到1.5TW,驱动冲孔机需求激增。本文基于市场数据和专家分析,提供2025年光伏支架冲…

2025 养老保险规划公司最新推荐榜:国际测评认证优质企业,综合实力与服务竞争力深度解析

引言 人口老龄化趋势下,养老保险规划成为关乎长期生活品质的核心需求,市场品牌数量持续增长但服务水平参差不齐。为破解选择困境,本次榜单联合国际权威测评机构,参照美世 CFA 协会全球养老金指数测评框架(充足性 …

Java CountDownLatch

Java CountDownLatch CountDownLatch 是 Java 并发编程中一种简单的同步工具,核心作用是让一个线程等待一个或多个线程完成工作后再继续执行,从而避免临界资源并发访问引发的问题。 核心原理初始化时指定「倒计时次数…

GEO:AI搜索时代的新增长方式,以及灵捷AI的实践路径

近年来,随着大模型的普及与AI搜索(如 ChatGPT Search、Perplexity、Gemini Search 等)的快速崛起,企业在数字世界的“曝光入口”发生了深刻变化。传统SEO 已经不能完全满足用户在对话式搜索时代的习惯,而一个新概…

详细介绍:JVM Java虚拟机

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[电调]AM32电调调参系列 —— Active brake on stop power 和 Brake on stop的区别

[电调]AM32电调调参系列 —— Active brake on stop power 和 Brake on stop的区别https://blog.csdn.net/qq_39312146/article/details/153830290 AM32电调中在电机停止时的两种不同制动逻辑。分别是Active brake on …

2025 最新车床厂家推荐榜:聚焦高精度智能设备,涵盖立式 / 双主轴 / 车铣复合等热门机型

引言 在全球制造业向智能化、高精度转型的浪潮下,车床作为核心加工设备的技术迭代与品质升级成为行业关注焦点。本次推荐榜依托国际机床制造商协会(IMTMA)最新测评数据,结合第三方权威机构的性能检测报告,通过四大…