首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 Source Generator 在编译你 .NET 项目时自动生成代码

引用 Microsoft.CodeAnalysis.Analyzers Microsoft.CodeAnalysis.CSharp 并且不对外传递他们依赖。...而我 dotnetCampus.Ipc 库编写生成代码会稍微复杂一点,会根据项目中标记了 IpcPublic 代码动态生成对这个类代理访问对接代码,使用Roslyn 进行语义分析。...="false" /> OutputItemType="Analyzer" 表示将项目添加为分析器,ReferenceOutputAssembly="false" 表示此项目无需引用分析器项目的程序...当然,除了用项目引用方式,你还能直接引用最终 dll: 1 2 3 <Analyzer Include="..\.....https://blog.walterlv.com/post/generate-csharp-source-using-roslyn-source-generator ,以避免陈旧错误知识误导,同时有更好阅读体验

41830

IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序之间 InternalsVisibleTo 关系

本文告诉大家如何在使用 IIncrementalGenerator 进行增量 Source Generator 生成代码时,如何判断两个程序之间是否存在 InternalsVisibleTo 关系...internal 可见 以下是详细例子代码 本文例子任务是编写一个 Roslyn 分析器,分析器里面使用 IIncrementalGenerator 增量 Source Generator 生成代码...回到咱这个例子任务上,就是 Analyzers 分析器项目编写代码,分析 App 项目所引用程序里面的存在哪些程序对 App 程序设置了 internal 可见 完成准备工作之后,接下来开始本文核心逻辑编写...判断引用程序是否对当前正在分析程序设置了 internal 可见,即可通过 GivesAccessTo 方法进行判断,代码如下 [Generator(LanguageNames.CSharp)]...Lib2 程序 通过以上代码,即可在 Roslyn 分析器里面,了解程序之间 internal 关系,从而可以生成出更加符合预期代码 本文所有代码放在 github gitee 上,可以通过以下方式获取整个项目的代码

22120
您找到你想要的搜索结果了吗?
是的
没有找到

使用 Roslyn 对 C# 代码进行语义分析

而使用语义分析,你可以像在运行时使用反射一样,在编译时访问源代码各种类型、属性、方法等,特别适合用来分析引用、生成代码等。当然,实际项目里面将两者结合起来可以做到更多效果。...关于代码分析器(Analyzer修改器(CodeFix)可以参考我之前这些博客: 参考:基于 Roslyn 同时为 Visual Studio 插件 NuGet 包开发 .NET/C# 源代码分析器...Analyzer 修改器 CodeFixProvider - walterlv 参考:使用基于 Roslyn Microsoft.CodeAnalysis.PublicApiAnalyzers...来追踪项目的 API 改动,帮助保持库 API 兼容性 - walterlv 参考:使用 Roslyn 分析代码注释,给 TODO 类型注释添加负责人、截止日期 issue 链接跟踪 - walterlv...如果你正在编写代码生成器(Generator) 代码生成器入口方法带有一个 GeneratorExecutionContext 类型参数,而它直接就有我们需要两种对象。

33320

为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试

本文属于 IIncrementalGenerator 增量 Source Generator 源代码生成入门系列博客,本文将大家介绍如何为源代码生成项目添加单元测试 添加单元测试作用不仅可以用来实现通用单元测试提高质量功能...详细请参阅之前 walterlv 大佬编写博客 使用 Source Generator 在编译你 .NET 项目时自动生成代码 - walterlv 这样过程显然对开发效率造成了一定影响,本文接下来介绍添加单元测试方法...增量 Source Generator 源代码生成项目。...解决方法就是添加正常代码给到自己项目里面,然后直接将代码文件内容读取出来。比如说将代码文件输出到输出文件夹,或者是将代码文件嵌入到程序,走程序读取资源方式。...正式使用时候,需要先确保所有的引用加载上,且作为输入源代码都能正常构建通过 本文以上代码放在github gitee 欢迎访问 可以通过如下方式获取本文源代码,先创建一个空文件夹,接着使用命令行

10510

ClassDescription

我们开发过程,总有那么些需求是那么变态。常规方案已经无法满足。比如某些规则非常复杂,而客户又经常要修改它。那么我们可能需要把这部分代码直接做为配置文件提取出来。...每次修改后直接热更新进我们程序。比如我们做低代码工具时候可能需要根据用户输入直接动态生成某些类型。再比如我们做 BI 工具时候可能需要根据用户选择直接动态生成 Entity 类型。...Natasha 是基于 Roslyn C# 动态程序构建库,该库允许开发者在运行时使用 C# 代码构建域 / 程序 / 类 / 结构体 / 枚举 / 接口 / 方法等,使得程序在运行时候可以增加新模块及功能...该库遵循完整编译流程,提供完整错误提示, 自动添加引用,完善数据结构构建模板让开发者只专注于程序脚本编写,兼容 netcoreapp3.0+, 跨平台,统一、简便链式 API。...Source Generator 最近几个版本 .NET 是一个非常重要技术。通过它可以让程序性能很大提升。下一篇我们就来说说 Source Generator 。 敬请期待。

51420

IIncrementalGenerator 增量 Source Generator 生成代码入门 获取引用程序所有类型

本文告诉大家如何在使用 IIncrementalGenerator 进行增量 Source Generator 生成代码时,如何获取到当前正在分析程序引用所有的程序,以及引用程序里面的所有类型...这项技术可以用在生成导出类型相关需求上,比如我想导出我当前程序里面所有引用程序继承于 IFoo 接口所有类型,即可采用本文介绍方法 核心逻辑是 Compilation 里面拿到 SourceModule...属性 这里 ReferencedAssemblySymbols 属性就是当前程序引用程序集了 在这些程序上枚举所有程序语义类型即可获取到所有的类型 以下是详细例子 为了方便描述本文技术实现...于是 Analyzers 分析器项目里面编写 IIncrementalGenerator 增量 Source Generator 生成代码逻辑将可以被正常执行 最后来到最重要 Analyzers...,咱需要先从 context 里面的 CompilationProvider 获取到引用程序,代码如下 [Generator(LanguageNames.CSharp)] public class

21720

从零开始学习 dotnet 编译过程 Roslyn 源码分析

本文整理我 林德熙 学习 dotnet 编译知识、Roslyn 源码分析知识,NuGet 知识。通过阅读本文可以从零散碎片化博客得到从零开始学习轨迹。...以下是这部分性能数据: C# 程序集数量对软件启动性能影响 - 林德熙 不过,程序集中数量对启动性能没有影响: C# 直接创建多个类使用反射创建类性能 - 林德熙 SourceFusion...坑很多,有些可以解,有些需要规避: 帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖 NuGet 包 - 吕毅 MSBuild/Roslyn NuGet 100 个坑 - 吕毅 Roslyn...通过 Nuget 引用源代码 VS 智能提示正常但是无法编译 - 林德熙 如果你 NuGet 格式是旧,或者说引用方式是旧,推荐升级: 自动将 NuGet 包引用方式从 packages.config... ToString ToFullString 区别 - 林德熙 Roslyn 为何能够提供如此友好 API 情况下依然有如此高性能?

23740

尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码

只是刚开始用时候就被自己逗了一下哈,熟悉 Source Generator 基础上,用起来难度很低。...通过 使用 Source Generator 在编译你 .NET 项目时自动生成代码 - walterlv 可以了解到,要让代码生成项目可以运行,有两个方法,第一个方法就是打包为 NuGet 包,通过引用...,类型名称随意,将在此类型里面编写增量代码生成逻辑 增量代码生成普通 Source Generator 一样,需要在代码生成入口类型上标记特性,如以下代码 [Generator(LanguageNames.CSharp...如此就是增量代码生成关键 告诉框架层从变更文件里面感兴趣什么数据,对数据预先进行处理 预先处理过程,是会不断进行丢掉处理 其中第一步第二步可以合在一起 使用给出数据进行处理源代码生成逻辑...这一步逻辑普通 Source Generator 是相同,只是输入参数不同 下面开始编写代码逻辑 先从 IncrementalGeneratorInitializationContext

40220

译 | 使用Roslyn分析器高效编写更好代码

使用包管理器 UI Visual Studio 安装包。 ? 安装包后,只需从解决方案资源管理器自定义分析器诊断。分析器节点将显示解决方案资源管理器"引用"或"依赖项"节点下。...如果展开分析器,然后展开其中一个分析器程序,则可以程序集中看到所有诊断。 ? 您可以属性窗口中查看诊断属性,包括其描述默认严重性。...解决方案资源管理器每个诊断项旁边图标对应于您在编辑器打开规则时看到图标: 圆圈"i"表示信息 三角形"!"...表示警告 圆圈"x"表示严重 浅色背景上圆圈"i"表示隐藏严重 圆圈"*"表示忽略诊断 ? 然后,可以从解决方案资源管理器设置规则严重性。解决方案资源管理器,展开依赖项分析器。...展开包含要为其设置严重性规则程序。右键单击规则并选择"设置规则严重性",并在弹出菜单中选择一个严重性选项。 ? 如果将规则严重性设置为警告,则会在代码收到该特定规则警告。 ?

2.2K30

推荐 .NETC# 开发者安装几款代码分析插件或对应代码分析 NuGet 包

如果你使用是旧版本 Visual Studio,那么默认代码分析规则是“最小建议规则”。基于这个,写出来代码其实只能说是能跑通过而已。...VS 扩展:Meziantou.Analyzer NuGet 包:Meziantou.Analyzer 类型 这里分析器分为 Visual Studio 扩展形式分析器 NuGet 包形式分析器...Visual Studio 扩展形式分析器可以让你一次安装对所有项目生效,但缺点是不能影响编译过程,只能作为 Visual Studio 编写代码时给出提示。...Visual Studio 2019 自带分析器诊断 ID 都是以 IDE 开头,因此你可以通过这个前缀来区分是否是 Visual Studio 2019 自带分析器提示。...配置代码分析严重程度 你项目中对于某项规则严重性看法也许跟微软或其他第三方分析器不一样,因此你需要自己配置规则严重性。

48430

IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序引用关系

本文将告诉大家如何在 IIncrementalGenerator 增量 Source Generator 生成代码里面, Roslyn 分析器里面判断两个程序是否存在引用关系 先上核心代码实现,核心代码就是调用以下代码进行判断程序引用关系...else { // 没有访问过,获取引用程序是否存在引用关系...Modules 从而获取到 ReferencedAssemblySymbols 也就是当前程序引用所有程序,再判断引用程序里面是否包含期望被引用程序 对于间接引用程序来说,需要进行遍历才可以判断到...,但是此时需要处理程序循环引用问题。...本文这里采用传入一个字典方法解决这个问题 获取当前分析器所分析项目的引用程序,可以通过 Compilation SourceModule ReferencedAssemblySymbols

14310

IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名

本文告诉大家如何在使用 IIncrementalGenerator 进行增量 Source Generator 生成代码时,如何从语法分析过程,将获取语法 Token 转换到语义分析上,比如获取类型完全限定名...一个使用例子是拿到一个 Token 表示某个类型时,本文将演示通过语义分析获取到拿到 Token Type 类型 FullName 带命名空间完全限定名 开始之前,期望大家已了解语法分析语义分析差别...可通过阅读 Roslyn 入门:使用 Roslyn 静态分析现有项目中代码(语法分析) - walterlv 使用 Roslyn 对 C# 代码进行语义分析 - walterlv 博客对此进行了解...初始化项目 开始之前,先创建好测试使用项目,创建两个项目,分别是分析器项目,使用分析器项目。... Roslyn 里面的设计就是缓加载方式, Linq 一样,只有需要用到时候才执行 为了让以上委托能够被执行,添加 RegisterSourceOutput 用来让底层执行委托内容,代码如下

66830

.Net 编译器平台 --- Roslyn

尽管每个标识符都是唯一不同,但确定它实际引用内容通常需要对语言规则有深入了解。 源代码中有表示程序元素部分,程序也可以引用先前编译库,这些库打包在程序文件。...虽然程序没有可用源代码,因此没有语法节点或语法树,但程序仍然可以引用其中元素。 除了源代码语法模型外,语义模型还封装了语言规则,使您可以轻松区分这些元素。...汇编(Compilation) 编译是用于编译C#或Visual Basic程序一切所需表示,其中包括所有的程序引用、编译器选项源文件。...编译包含各种方法,帮助您查找关联在源代码声明符号或从程序集中作为元数据导入符号。 与语法树类似,编译是不可变。创建编译之后,您或其他人都无法对其进行更改。...许多这些属性直接引用其他符号。例如,IMethodSymbol 类 ReturnType 属性告诉您方法声明引用实际类型符号。 符号源代码元数据之间提供了命名空间、类型成员共同表示。

22730

.NET周报 【7月第1期 2023-07-02】

引用类型 https://www.cnblogs.com/artech/p/17509624.html 我面试时候经常会问一个问题:“谈谈值类型引用区别”。...对于这个问题,绝大部分人都只会给我两个简洁答案:“值类型分配在栈引用类型分配在堆”,“默认情况下,值类型参数传值(拷贝),引用类型参数传引用”。...其实这个问题有很大发挥空间,如果能够从内存布局、GC、互操作、跨AppDomain传递等方面展开,相信会加分不少。这篇文章独辟蹊径,从“变量”角度讨论值类型引用类型区别。...其他更新 C# 支持、新用户新 UI 默认值、每个项目的自定义颜色、访问性改进、添加结构视图过滤器排序、Roslyn(源生成器)改进模板、远程调试器,例如 ARM32 支持 【英文】Cysharp...本文提到使用一种机制通过 Community Kit Lab Source Generator 生成代理。

15220
领券