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

在Roslyn Analyzer/Source Generator中,有没有办法区分直接和可传递的程序集引用

在Roslyn Analyzer/Source Generator中,可以通过检查程序集引用的传递性来区分直接和可传递的程序集引用。

直接程序集引用是指在项目文件中明确列出的引用,通常是通过添加引用或使用NuGet包管理器添加的。这些引用是直接依赖于项目的,可以在代码中直接使用。

可传递的程序集引用是指间接依赖于项目的引用,即项目所依赖的其他程序集所引用的程序集。这些引用是通过直接引用的程序集间接传递给项目的。

要区分直接和可传递的程序集引用,可以使用Roslyn提供的API来分析项目的引用关系。以下是一种可能的实现方式:

  1. 使用Roslyn的Project类加载项目文件。
  2. 使用Project类的GetCompilationAsync()方法获取项目的编译对象。
  3. 使用编译对象的GetReferencedAssemblySymbols()方法获取项目的所有程序集引用。
  4. 对于每个程序集引用,可以使用AssemblySymbol类的Locations属性获取引用的程序集文件路径。
  5. 对于每个程序集引用的文件路径,可以使用AssemblyMetadata.CreateFromFile()方法创建AssemblyMetadata对象。
  6. 使用AssemblyMetadata对象的GetReferencedAssemblies()方法获取该程序集引用的所有传递引用。
  7. 根据传递引用的数量,可以判断该程序集引用是直接引用还是可传递引用。

需要注意的是,以上步骤仅为一种可能的实现方式,具体实现可能因项目结构和需求而有所不同。

对于Roslyn Analyzer/Source Generator中的程序集引用区分,腾讯云并没有提供特定的产品或服务。腾讯云提供的云计算产品和服务主要包括云服务器、云数据库、云存储、人工智能等,可以根据具体需求选择适合的产品和服务。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用 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 ,以避免陈旧错误知识的误导,同时有更好的阅读体验

62830

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 上,可以通过以下方式获取整个项目的代码

27620
  • 使用 roslyn 的 Source Generator 自动完成依赖收集和注册

    在 使用 Hosting 构建 WPF 程序 提到,因为不使用 Stylet 默认的 IOC 容器,所以不能自动收集和注册 View/ViewModel,需要动手处理。...这里使用 roslyn 的 Source Generator 自动完成依赖收集和注册。...="false"/> OutputItemType="Analyzer" 表示将项目添加为分析器 ReferenceOutputAssembly="false" 表示此项目无需引用分析器项目的程序集...2 调试 source generator 对于新建的 source generator 项目,rider 会自动生成 launchSettings.json,可以直接启动项目进行调试 { "$schema...新的增量源代码生成器是很好饯行不可变和增量模式的写法,可以使用更少的资源 尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码 | 林德熙 using

    6300

    使用 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 类型的参数,而它直接就有我们需要的两种对象。

    62620

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

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

    15010

    ClassDescription

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

    55020

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

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

    31620

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

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

    52420

    从零开始学习 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 的情况下依然有如此高的性能?

    42640

    Roslyn 分析器 读取 csproj 项目文件的 AdditionalFiles Item 的 Metadata 配置

    定义在 ItemGroup 里面的各个引用文件的 Item 可带上自定义的 Metadata 内容,这部分内容需要转换到 AdditionalFiles 的 Metadata 上才能被分析器所获取 在上一篇博客告诉大家如何在...IIncrementalGenerator 增量 Source Generator 里读取 csproj 项目文件的属性配置,详细请看: IIncrementalGenerator 增量 Source...,用于让我可以在 VisualStudio 项目里面看到文件而已,和本文实际的演示没有关系 添加分析器 KereqeewahaihibayNohelqiji 项目,分析器项目的 csproj 项目文件的代码如下...EnforceExtendedAnalyzerRules 属性含义请参阅 Roslyn 分析器 EnforceExtendedAnalyzerRules 属性的作用 在 KereqeewahaihibayNohelqiji...的 IIncrementalGenerator 增量 Source Generator 生成器,代码如下 namespace KereqeewahaihibayNohelqiji { [Generator

    12210

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

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

    2.4K30

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

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

    19010

    推荐 .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 自带的分析器提示的。...配置代码分析严重程度 你的项目中对于某项规则严重性的看法也许跟微软或其他第三方分析器不一样,因此你需要自己配置规则集的严重性。

    85530

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

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

    79330
    领券