使用代码图映射依赖关系
在本文中,你将了解如何通过代码图跨代码可视化依赖关系。
什么是代码图?
在 Visual Studio 中,代码图有助于更快地了解程序代码如何搭配使用,而无需读取文件和各行代码。 利用这些代码图,你可以查看代码中的组织和关系,包括其结构及其依赖项、更新方式,并估计建议更改的成本。
可以映射以下语言中的代码的依赖关系:
解决方案或程序集(.dll 或 .exe)中的 Visual C# 或 Visual Basic
Visual C++ 项目、头文件(.h 或
#include
)或二进制文件中的本机或托管的 C 或 C++ 代码通过 Microsoft Dynamics AX 的 .NET 模块生成的 X++ 项目和程序集
注意
除 C# 或 Visual Basic 之外的项目,启动代码图或将项添加到现有代码图的选项变得非常有限。 例如,不能用鼠标右键单击 C++ 项目的文本编辑器中的对象并将其添加到代码图。 但是,你可以从解决方案资源管理器、类视图和对象浏览器拖放各个代码元素或文件。
先决条件
要在 Visual Studio 中创建代码图,首先安装代码图和实时依赖项验证组件
若要创建和编辑代码图,需要 Visual Studio Enterprise 版本。 然而,在 Visual Studio Community 和 Professional 版本中,可以打开在 Enterprise 版本中生成的关系图,但不能对其进行编辑。
注意
在你与使用 Visual Studio Professional 的其他人共享 Visual Studio Enterprise 中创建的代码图之前,请确保代码图上的所有项(例如隐藏项、展开的组和跨组链接)均可见。
添加代码图
可以创建空代码图,并将项拖动到其上,包括程序集引用、文件和文件夹,也可以为解决方案的全部或部分生成代码图。
添加空代码图:
在“解决方案资源管理器”中,打开顶级解决方案节点的快捷菜单 。 选择“添加”>“新项” 。
在“添加新项”对话框中,在“已安装”下,选择“常规”类别 。
选择“定向关系图文档 (.dgml)”模板,然后选择“添加”。
提示
此模板可能不会按字母顺序显示,因此,如果看不到,请向下滚动到模板列表的底部。
解决方案的“解决方案项”文件夹中会出现一张空白代码图。
同样,可以通过选择“体系结构”>“新建代码图”或“文件”>“新建”>“文件”创建新的代码图文件,而不必将其添加到解决方案 。
了解详细信息:
为解决方案生成代码图
查看解决方案中的所有依赖关系:
在菜单栏上,选择“体系结构”>“生成解决方案的代码图” 。 如果代码自上次生成后未发生更改,请改为选择“体系结构”>“无需构造生成解决方案的代码图” 。
生成显示顶级程序集和这些程序集之间的聚合链接的代码图。 聚合链路越广,它所代表的依赖关系就越多。
使用代码图工具栏上的“图例” 按钮以显示或隐藏项目类型图标(如测试项目、Web 项目和 Phone 项目)、代码项(如类、方法和属性)以及关系类型(如继承自、实现和调用)的列表。
此示例解决方案包含解决方案文件夹(“测试” 和“组件” ),测试项目、Web 项目和程序集。 默认情况下,所有包含关系均以 “组”的形式显示,你可以对其进行展开和折叠。 “外部”组包含你的解决方案之外的任何内容,包括平台依赖项。 外部程序集仅显示已使用的项。 默认情况下,系统基类型隐藏在代码图中以减少混乱。
若要深入了解代码图中,请展开表示项目和程序集的组。 可以通过按“CTRL+A” 展开全部内容以选择所有节点,然后选择“组” ,再选择快捷菜单中的“展开” 。
但是,这对大型解决方案可能并无作用。 事实上,对于复杂的解决方案,内存限制可能会阻止你展开所有组。 相反,若要在单个节点内进行查看,则将其展开。 将鼠标指针移动到节点的顶部,然后单击出现的 V 形。
或使用键盘选择项,然后按加号键(“+” + )。 若要查看更深层次的代码,请对命名空间、类型和成员执行相同操作。
提示
有关使用鼠标、键盘和触控处理代码图的详细信息,请参阅浏览和重新排列代码图。
若要简化代码图并将重点关注各个部分,选择代码图工具栏上的“筛选器” ,然后仅选择你感兴趣的节点和链接类型。 例如,可以隐藏所有的解决方案文件夹和程序集容器。
还可以通过从代码图中隐藏或删除单个组和项来简化代码图,而不影响基础解决方案代码。
若要查看各项间的关系,请在代码图中选择各项。 链接的颜色指示关系的类型,如“图例” 窗格中所示。
在此示例中,紫色链接为调用,点式链接为引用,浅蓝色链接为字段访问。 绿色链接可以是继承,也可能是指示一个以上关系(或 “类别” )类型的 “聚合链接”。
提示
如果你看到的是绿色链接,它是指可能不仅仅存在继承关系。 可能也存在方法调用,但是这些都被继承关系所隐藏。 若要查看特定类型的链接,请使用“筛选器”窗格中的复选框,以便隐藏不感兴趣的类型。
若要获取有关项或链接的详细信息,请将指针移至其顶部,直至出现工具提示。 这将显示代码元素或链接所表示的类别的详细信息。
若要检查聚合链接表示的项和依赖项,请首先选择该链接,然后打开它的快捷菜单。 选择“显示参与链接” (或“在新代码图上显示参与链接” )。 这将展开位于链接两端的组,且仅显示参与链接的项和依赖项。
若要关注代码图的特定部分,可继续删除不感兴趣的项。 例如,若要深入了解类和成员视图,只需筛选“筛选器” 窗格中的所有命名空间节点。
集中精力处理复杂的解决方案代码图的另一种方式是从现有代码图生成包含选定项的新代码图。 按住“Ctrl”同时选择需关注的项,打开快捷菜单并选择“从选定内容新建图”。
将包含上下文转入新代码图。 使用“筛选器”窗格隐藏解决方案文件夹以及不想看到的任何其他容器。
展开组,选择代码图中的项,以便查看关系。
另请参阅:
- 浏览和重新排列代码图
- 通过编辑 DGML 文件自定义代码图
- 通过运行分析器发现代码中的潜在问题
查看依赖关系
假设你在一些具有挂起更改的文件中执行代码审阅。 若要查看这些更改中的依赖关系,请从这些文件中创建一个代码图。
在“解决方案资源管理器”中,选择想要映射的所有项目、程序集引用、文件夹、文件、类型或成员。
在解决方案资源管理器工具栏上,选择“在代码图上显示”
。 或者,打开一个或一组项的快捷菜单,然后选择“在代码图上显示”。
还可以将项从解决方案资源管理器、类视图或对象浏览器拖到新的代码图或现有代码图中。 若要包含项的父层次结构,在按住“Ctrl”键的同时拖动项,或者使用代码图工具栏上的“包括父级”按钮来指定默认操作。 你还可以从外部 Visual Studio(例如从 Windows 资源管理器)中拖动程序集文件。
注意
当你从在多个应用(如 Windows Phone 或 Microsoft Store)之间共享的项目添加项时,这些项将与当前活动的应用项目一起显示在代码图上。 如果你将上下文更改为另一个应用程序项目并从共享的项目添加更多项,则这些项现在将与最近活动的应用程序项目一起显示。 你对代码图上的项执行的操作仅适用于共享相同上下文的项。
代码图将显示在选定项的包含程序集内的选定项。
如要查看项,请把项展开。 将鼠标指针移动到项的顶部,然后单击出现的 V 形(向下键)。
若要展开所有项,使用“CTRL+A” 选择它们,然后打开代码图的快捷菜单并依次选择“组”>“展开” 。 然而,如果展开所有组会生成不可用的代码图或产生内存问题,则该选项不可用。
如有必要,继续展开感兴趣的项,直到类和成员级别。
若要查看存在于代码中而不显示在代码图上的成员,请单击组左上角的“重新提取子级”图标
。
若要查看更多与代码图上的项相关的项,请选择其中一个,再选择代码图工具栏上的“显示相关内容” ,然后选择要添加到图中的相关项的类型。 或者,选择一个或多个项,打开快捷菜单,然后为要添加到代码图中的相关项类型选择“显示”选项。 例如:
对于 程序集,请选择:
选项 说明 显示此项引用的程序集 添加此程序集引用的程序集。 外部程序集将显示在“外部” 组中。 显示引用此项的程序集 在解决方案中添加引用此程序集的程序集。 对于 命名空间,请选择“显示包含程序集” (如果它不可见)。
对于 类 或 接口,请选择:
选项 描述 显示基类型 对于类,添加基类和实现的接口。
对于接口,请添加基接口。显示派生类型 对于类,添加派生类。
对于接口,请添加派生接口和实现类或结构。显示此项引用的类型 添加此类使用的所有类及其成员。 显示引用此项的类型 添加使用此类的所有类及其成员。 显示包含命名空间 添加父命名空间。 显示包含命名空间和包含程序集 添加父容器的层次结构。 显示所有基类型 以递归方式添加基类或接口层次结构。 显示所有派生类型 对于类,以递归方式添加所有派生类。
对于接口,请以递归方式添加所有派生接口和实现类或结构。对于 方法,请选择:
选项 说明 显示此项调用的方法 添加此方法调用的方法。 显示此项引用的字段 添加此方法引用的字段。 显示包含类型 添加父类型。 显示包含类型、包含命名空间和包含程序集 添加父容器的层次结构。 显示重写的方法 对于重写其他方法或者实现接口方法的方法,在已重写的基类和已实现的接口方法(如果有)中添加所有抽象方法或虚方法。 对于 字段 或 属性,请选择:
选项 说明 显示包含类型 添加父类型。 显示包含类型、包含命名空间和包含程序集 添加父容器的层次结构。 代码图显示关系。 在此示例中,代码图显示了由
Find
方法调用的方法及其在解决方案中或在外部的位置。若要简化代码图并将重点关注各个部分,选择代码图工具栏上的“筛选器” ,然后仅选择你感兴趣的节点和链接类型。 例如,关闭解决方案文件夹、程序集和命名空间的显示。