IIncrementalGenerator 判断程序集的引用关系
本文将告诉大家如何在 IIncrementalGenerator 增量 Source Generator 生成代码里面,在 Roslyn 分析器里面判断两个程序集是否存在引用关系
先上核心代码实现,核心代码就是调用以下代码进行判断程序集的引用关系
private static bool IsReference(IAssemblySymbol currentAssemblySymbol, IAssemblySymbol requiredAssemblySymbol,
Dictionary<IAssemblySymbol, bool /*是否引用*/> visited)
{
if (SymbolEqualityComparer.Default.Equals(currentAssemblySymbol, requiredAssemblySymbol))
{
// 这个就看业务了,如果两个程序集是相同的,是否判断为引用关系
return true;
}
foreach (var moduleSymbol in currentAssemblySymbol.Modules)
{
foreach (var referencedAssemblySymbol in moduleSymbol.ReferencedAssemblySymbols)
{
if (SymbolEqualityComparer.Default.Equals(referencedAssemblySymbol, requiredAssemblySymbol))
{
// 记录当前程序集存在引用关系
visited[currentAssemblySymbol] = true;
return true;
}
else
{
if (visited.TryGetValue(referencedAssemblySymbol, out var isReference))
{
// 这个是访问过的,那就从字典获取缓存,不需要再访问一次
// 同时也能解决程序集循环引用问题
}
else
{
// 没有访问过的,获取引用的程序集是否存在引用关系
isReference = IsReference(referencedAssemblySymbol, requiredAssemblySymbol, visited);
visited[referencedAssemblySymbol] = isReference;
}
if (isReference)
{
// 如果这个程序集有引用,那也算上
return true;
}
}
}
}
return false;
}
核心判断逻辑就是获取当前程序集的 Modules 从而获取到 ReferencedAssemblySymbols 也就是当前程序集所引用的所有程序集,再判断引用的程序集里面是否包含期望被引用的程序集
对于间接引用的程序集来说,需要进行遍历才可以判断到,但是此时需要处理程序集循环引用问题。本文这里采用传入一个字典的方法解决这个问题
获取当前分析器所分析的项目的引用程序集,可以通过 Compilation 的 SourceModule 的 ReferencedAssemblySymbols 拿到,如以下代码
context.CompilationProvider.Select((compilation, _) =>
{
var sourceModuleReferencedAssemblySymbols = compilation.SourceModule.ReferencedAssemblySymbols;
... // 忽略代码
});
本文所有代码放在 github 和 gitee 上,可以通过以下方式获取整个项目的代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin c87c7e78b068956f3f8f4640a85c04a3af9e07fc
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin c87c7e78b068956f3f8f4640a85c04a3af9e07fc
获取代码之后,进入 HulanucerbeljuChaijacemjarga 文件夹
IIncrementalGenerator 判断程序集的引用关系的更多相关文章
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
先来点与标题不相关的: CLR支持两种程序集:弱命名程序集和强命名程序集. 两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名.由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CL ...
- 【转】Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)
http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与 ...
- (转)Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)
自:http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行 ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
- [转载] Java的四种引用关系
目录 1 强引用 (Final Reference) 2 软引用 (Soft Reference) 2.1 案例1: 软引用的垃圾回收 2.2 案例2: 软引用缓存的使用 2.3 软引用的应用场景 3 ...
- Js的引用关系示例和总结
三种引用(指针引用)关系,借助引用关系可以形成复杂的链关系,巧妙借助链关系可以实现收放自如,形散神不散的神奇效果,jquery就是其中一例: 1.对象指向属性; 2.a=b(b是对象,a ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
- Oracle查找表的外键引用关系
Oracle查找表的外键引用关系 select t1.table_name, t2.table_name as "TABLE_NAME(R)", t1.constraint_nam ...
- CI源码引用使用--php引用demo,静态变量和引用关系
CI源码引用使用在Common.php中,加载配置和类的方法 function &test() { static $a = ''; if (!$a) { $a ...
- SQL Server 查看对象之间的引用关系
前期准备: use studioA; go create table T(X int,Y int); insert into T(X,Y) values(1,1),(2,2); ...
随机推荐
- 01.Android崩溃Crash封装库
目录介绍 01.该库具有的功能 02.该库优势分析 03.该库如何使用 04.降低非必要crash 05.异常恢复原理 06.后续的需求说明 07.异常栈轨迹原理 08.部分问题反馈 09.其他内容说 ...
- LOTO示波器_从零开始手把手测电源开环增益/电源环路频响曲线/PSM
我们之前有篇文章从理论到实践演示了如何测量电源环路的开环增益曲线,不过偏重于理论和原理,没有很多细节的展现,所以这片文章从另外的角度,从零基础开始,手把手一步一步演示如果进行实操测试. 之前的那篇文章 ...
- 【Oracle】手动安装和卸载Oracle,这是最全的一篇了!!
写在前面 之前写过一篇在CentOS 7/8上安装Oracle的文章,按照我写的文章安装成功了,但是卸载Oracle时出现了问题.今天,我就整理一篇手动安装和卸载Oracle的文章吧.全文为实战型内容 ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)
一.Grid/GridItem 1.概述 网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活.简洁.易于维护.网格布局能够将页面分成多个单元格,可以在这些 ...
- #线性基#LOJ 114 k大异或和
题目 分析 建出线性基后,但是要求最小所以要重建线性基让大的尽量小, 然后第k小就是拼凑 代码 #include <cstdio> #include <cctype> #inc ...
- 6本值得推荐的MySQL学习书籍(有赠书福利)
前言 在DotNetGuide技术社区交流群和微信公众号后台经常收到小伙伴们的留言,让我出一期MySQL相关学习书籍的推荐文章.因此,今天我特意为大家精选了 6 本值得推荐的 MySQL 学习书籍,希 ...
- openGauss数据库的安装与使用
VMware+CentOS7.6+OpenGauss2.0.1 极简版安装 环境准备 Arch:x86-64 OS:Win11 VMware:16.1.2 安装 CentOS 7.6 CentOS 镜 ...
- 我为什么选择Wiki.js记笔记?
很长一段时间里,我都被困扰着,感觉陷入了笔记的泥潭,而积累的如此多的笔记也没有形成我自己的知识体系. 之前的记笔记方式 笔记的来源 微信公众号 技术博客 纸质书籍 官网文档 PDF 自己的零散想法 网 ...
- Hessian反序列化分析
RPC协议 RPC全称为Remote Procedure Call Protocol(远程调用协议),RPC和之前学的RMI十分类似,都是远程调用服务,它们不同之处就是RPC是通过标准的二进制格式来定 ...
- HUAWEI AppGallery Connect全新升级,支持HarmonyOS生态全生命周期服务!
原文:https://mp.weixin.qq.com/s/7aNIplUBdm_D1yyiMrQdAw,点击链接查看更多技术内容. HUAWEI AppGallery Connect全新升 ...