Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
今年4月发布的Visual Studio 2010 (以下简称VS2010)的旗舰版 提供了多种构架工具,来帮助开发人员分析和理解已有的代码库(Legacy Codebase),这些工具包括:依赖项关系图、顺序图以及体系结构资源管理器,Jennifer Marsman在她的博客中详细介绍了如何使用这些工具。然而在VS2010的正式发布版中,这些工具仅支持对.NET语言工程的支持,更确切地讲是仅支持C# 和VB.NET工程。对于广大的C/C++开发人员来说,他们也非常希望能够拥有类似的功能。为此,Visual Studio团队在今年6月份发布的Visualization and Modeling Feature Pack 工具包中,实现了对C/C++代码的可视化功能。
在安装了这个工具包后,就可以通过创建依赖项关系图(Dependency Graph)来了解和分析已有的C/C++代码工程了。这里我们以VS C++团队编写的Hilo工程 为例,来展示一下如何为C++ 工程创建依赖项关系图,Hilo的源代码可以在https://code.msdn.microsoft.com/Hilo下载到。
在VS中打开Hilo工程,选择菜单“体系结构”->“生成依赖项关系图”,如下图所示。在子菜单中,“按程序集”、“按名字空间”和“按类和自定义”是在VS 2010发布版中就有的,它们也可以用于C/C++的工程。这里新增加的一个菜单项是 “By Include File”,它是用来生成C/C++文件之间的#include引用关系的,会在另外的博客中进行介绍。注意:Visualization and Modeling Feature Pack仅提供了英文版,它可以安装在其它语言版本的VS 2010上,但显示的内容仍是英文的。
这里选择“按程序集”菜单项,它会生成如下的依赖项关系图(DGML有向图),显示Browser.exe与其它外部动态库文件之间的总体依赖关系:
进一步展开“外部”模块,可以看到Browser.exe依赖到了那些具体的动态库文件,如下图所示。当鼠标停留在模块之间的有向连线上的时候,会显示出“导向按钮”以及对连线所代表依赖关系的描述信息。
一步步展开到最底层,展现出来的就是函数之间的调用关系,如下图所示, Hilo::AnimationHelpers名字空间与Ole32.dll的以来关系归根结底就是 AnimationUtility::Initilize对CoCreateInstance的调用关系。鼠标双击图中的函数,如果有对应的代码则会自动打开代码文件,并自动定位到函数的位置,这样大大方便用户在浏览依赖关系模型时察看其对应的代码内容。
这个版本的Visualization and Modeling Feature Pack所生成的C/C++工程依赖项图,相对于为C#和VB.NET生成的依赖图,还是有一定的局限性:
- 首先,它只显示了函数调用类型的依赖关系,而并没用有像C#/VB.NET生成的依赖项关系图那样,还包含有引用、继承等等多种依赖关系;
- 其次,只显示了跨二进制文件(Cross-binary)之间的依赖关系,而没有同一文件内部(Intra-binary)函数之间的调用关系;
- 最后,只有参与了依赖关系的文件、名字空间、类和函数才被显在图上,而其它内容则没有显出来。这就解释了为什么在Ole32.dll中列出了4个函数,而其它的很多函数没有被列出,因为它们在当前的工程中没有被调用;
参考资源:
- Jason的博客:Announcing: VS2010 Productivity Power Tools and Modeling Feature Packs
- Soma的博客:Modeling Websites and Native Code
- Visual Studio 2010: How to understand your code using Dependency Graphs, Sequence Diagrams, and the Architecture Explorer
- How to: Generate Dependency Graphs for C and C++ Code
- Sneak peek at the first “Feature Pack” for VS2010 Visualization and Modeling Tools