ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

一个项目两种交付:RoslynClrHeapAllocationAnalyzer 的 NuGet 分析器与 VSIX 扩展打包完整指南

一个项目两种交付:RoslynClrHeapAllocationAnalyzer 的 NuGet 分析器与 VSIX 扩展打包完整指南 一个项目两种交付RoslynClrHeapAllocationAnalyzer 的 NuGet 分析器与 VSIX 扩展打包完整指南【免费下载链接】RoslynClrHeapAllocationAnalyzerRoslyn based C# heap allocation diagnostic analyzer that can detect explicit and many implicit allocations like boxing, display classes a.k.a closures, implicit delegate creations, etc.项目地址: https://gitcode.com/gh_mirrors/ro/RoslynClrHeapAllocationAnalyzerRoslynClrHeapAllocationAnalyzer 是一个基于 Roslyn 的C# 堆分配分析器heap allocation analyzer能帮你揪出代码里的显式分配以及大量隐蔽的隐式分配——比如值类型装箱、闭包display class、隐式委托创建等。它最妙的地方在于同一份分析器代码同时打包成两种交付物——一个 NuGet 分析器包构建时生效和一个 VSIX 扩展Visual Studio 编辑器内实时生效。本文带你拆解这套一份代码、两次打包的工程实践。这个 C# 堆分配分析器能抓到什么分析器采用经典的模板方法设计所有规则都继承自同一个抽象基类 AllocationAnalyzer只需声明关注的语法节点类型和具体分析逻辑。目前内置了 6 个专门的规则文件各管一摊规则文件负责检测的分配类型ExplicitAllocationAnalyzer.cs显式 new 对象/数组/匿名类型HAA0501~HAA0506TypeConversionAllocationAnalyzer.cs装箱、params数组、字符串拼接分配DisplayClassAllocationAnalyzer.cs闭包捕获变量产生的 display classCallSiteImplicitAllocationAnalyzer.cs隐式委托、方法组转换EnumeratorAllocationAnalyzer.csforeach 的迭代器分配ConcatenationAllocationAnalyzer.cs字符串拼接产生的分配每条规则都带有HAA前缀的诊断 ID如 HAA0501在诊断列表中一眼可辨。而且它很懂行AllocationRules.cs 会自动跳过.g.cs生成文件和带CompilerGeneratedAttribute的代码避免误报刷屏。解决方案一览三个项目的分工打开 ClrHeapAllocationAnalyzer.sln你会看到一次源码、两次打包的骨架ClrHeapAllocationsAnalyzer分析器本体netstandard2.0 类库唯一的真身代码ClrHeapAllocationsAnalyzer.VsixVSIX 打包壳自身几乎不写业务代码只做装盒ClrHeapAllocationsAnalyzer.TestMSTest 测试工程基于 RoslynTestKit 验证每条规则的准确性见 ClrHeapAllocationsAnalyzer.Test.csproj这种核心 两个薄壳的结构正是本文的重点。交付一NuGet 分析器包如何打包NuGet 包的配置全部集中在 ClrHeapAllocationAnalyzer.csproj 里不到 40 行就搞定关键就 3 处。关键配置把 DLL 放进 analyzers/dotnet/csMSBuild 和 Visual Studio 有个约定俗成的发现机制包内analyzers/dotnet/cs目录下的程序集会自动被当作 C# 分析器加载。本项目用两个配置配合实现IncludeBuildOutputfalse第 5 行——不让程序集出现在包根目录避免被当成普通引用None Include...dll Packtrue PackagePathanalyzers/dotnet/cs第 37 行——手动把程序集摆到约定路径。再配合GeneratePackageOnBuildtrue每次构建自动产出 nupkg无需手动执行dotnet pack。私有资产与 netstandard2.0让使用方零负担两个细节决定了这个包装上就能用对 Microsoft.CodeAnalysis 3.4.0 的引用标记了PrivateAssetsall——编译器依赖不会泄漏给引用方用户的包管理界面干干净净目标框架选 netstandard2.0——同时兼容 .NET Framework 下的 MSBuild 构建和 .NET Core 下的dotnet build。适用场景团队项目里加一条PackageReference本地编译和 CI 流水线都能得到一致的分配告警不依赖任何人装插件。✅交付二VSIX 扩展如何打包VSIX 侧是另一个世界旧式 csproj 清单文件核心是 source.extension.vsixmanifest。安装目标与依赖声明清单里的Installation节点声明了扩展能在哪些 IDE 上安装——VS 2017~2022 的 Community / Pro / Enterprise 各版本并按版本区分 x86 与 amd64 架构第 12~29 行。依赖方面声明了 .NET Framework 4.7.2第 32 行并以前置条件形式要求 IDE 自带Roslyn 编译器组件第 39 行——分析器必须搭着编译器才能跑。复用同一份分析器代码VSIX 项目自己几乎没有代码它通过 ProjectReference 引用分析器项目再在清单的Assets中把同一份程序集以Microsoft.VisualStudio.Analyzer资产类型注册第 35~36 行。Visual Studio 启动时扫描已安装扩展中的分析器资产并自动注册无需用户改任何项目文件。想调试扩展时VSIX 工程还贴心地配置了启动项第 63~67 行自动拉起一个devenv.exe /rootsuffix Roslyn实验实例扩展装进沙箱 IDE不污染你的主力环境。适用场景从 Visual Studio 扩展市场一键安装对应微软市场的 Clr Heap Allocation Analyzer写代码时编辑器实时下划线提示体验最即装即用。️两种交付怎么选一张表看懂维度NuGet 分析器包VSIX 扩展生效时机构建时编译出诊断编辑时IDE 实时提示推广方式项目里加一条包引用用户手动从市场安装覆盖范围团队所有开发者 CI仅安装了扩展的机器构建要求无纯 netstandard2.0需要 VSSDK 与 VS 开发工具链入口文件ClrHeapAllocationAnalyzer.csprojsource.extension.vsixmanifest经验之谈两者不冲突最好都要。NuGet 保证 CI 门禁不漏检VSIX 让开发者在敲代码时就看见问题。测试保障与项目现状无论最终打成什么包ClrHeapAllocationsAnalyzer.Test 里的测试先为每条规则兜底基于 SmartAnalyzers.RoslynTestKit 构造合成编译断言诊断 ID 与位置还有 IgnoreTests.cs 专门验证生成代码不误报的行为。这正是一份代码、两次打包能成立的前提——逻辑只有一份测试也只跑一遍两种交付天然一致。另外值得了解本项目已归档其中高价值的分析器规则正在合并进官方的 dotnet/roslyn-analyzers 仓库见 README.md。但正因如此它成为学习Roslyn 分析器打包成 NuGet 与 VSIX 双交付的最佳参考样本之一。如果你在本地跑通了这个仓库建议按顺序看三个文件分析器 csproj 的打包配置 → vsixmanifest 的资产声明 → 测试工程30 分钟就能掌握 Roslyn 分析器的完整交付链路。【免费下载链接】RoslynClrHeapAllocationAnalyzerRoslyn based C# heap allocation diagnostic analyzer that can detect explicit and many implicit allocations like boxing, display classes a.k.a closures, implicit delegate creations, etc.项目地址: https://gitcode.com/gh_mirrors/ro/RoslynClrHeapAllocationAnalyzer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表