作者:朱金灿
来源:http://blog.csdn.net/clever101
VS解决方案文件本质是一个文件文件,这个用记事本或者Node++之类的文本编辑软件打开一个VS解决方案文件就知道了。了解了这一点,我们知道使用c语言的文件操作函数就能读取VS解决方案文件了。下面是一个简单的读取函数:
#include "stdafx.h" #include <tchar.h> #include <string> int _tmain(int argc, _TCHAR* argv[]) { std::wstring strSlnFile = _T("G:\dev-utility-tools\src\dev-utility-tools.sln"); FILE* fp; TCHAR szBuff[3*_MAX_PATH];// 设定读取缓冲区为*260 if( (fp = _tfopen(strSlnFile.c_str(),_T("r"))) != NULL ) { memset(szBuff,' ',_MAX_PATH*3*sizeof(TCHAR)); while(_fgetts( szBuff,_MAX_PATH*3*sizeof(TCHAR), fp ) ) { _tprintf(_T("%s"),szBuff); } } getchar(); return 0; }
上述代码实现读取的是vs2008的解决方案文件,在win7旗舰版,vs 2008+sp1运行成功,效果图如下:
现在我们分析vs2008的解决方案文件存储的是什么信息?使用文本工具进行分析可以推断,我初步判断vs2008的解决方案文件可以划分为三部分:
第一部分为解决方案文件说明,第二部分为工程文件说明,以第一个Project开始,第三部分为工程平台设置,以Global开始,以EndGlobal结束。下面逐一作具体说明:
一个空的解决方案文件(即不包含任何工程)只有第一和第三部分,具体如下:
Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal
第一部分一般只有三行
第一行为空行
第二行为VS解决方案文件格式的版本说明,
如VS2008MicrosoftVisual Studio Solution File, Format Version 10.00
第三行为上一行的VS版本注释,如# Visual Studio 2008,可推断VS2005对应的解决方案文件版本为9.00
第二部分为工程说明,这里的工程分为源码工程和虚拟文件夹。
单个工程说明的格式为
Project("{工程类型标识}") = "工程名", "工程文件相对解决方案文件的位置", "{工程标识}"
ProjectSection(ProjectDependencies)= postProject # 所依赖的工程
所依赖工程1的标识 =所依赖工程1的标识
EndProjectSection
EndProject
若无依赖工程,则无ProjectSection(ProjectDependencies) = postProject这个部分。
在VS2008中,源码工程的标识为8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942,虚拟文件夹的标识为2150E333-8FDC-42A3-9474-1A3956D46DE8,貌似都是GUID。虚拟文件夹并无对应的工程文件,因此在位置一项中取其名字。
第三部分为工程平台设置。这里的工程平台设置分为两部分,一是解决方案配置,二是对应的解决方案平台,具体如下图:
![](http://img.my.csdn.net/uploads/201308/17/1376734130_4952.png)
从上图可知,所有的工程配置数等于解决方案配置数乘以解决方案平台。
这部分的具体说明如下:
Global # 开始符 # 列出解决方案所有的配置数 GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection #指定每个工程的具体配置 GlobalSection(ProjectConfigurationPlatforms) = postSolution {01EA6707-BDD4-4074-A5F0-CBCEB660E094}.Debug|Win32.ActiveCfg = Debug|Win32 {01EA6707-BDD4-4074-A5F0-CBCEB660E094}.Debug|Win32.Build.0 = Debug|Win32 {01EA6707-BDD4-4074-A5F0-CBCEB660E094}.Release|Win32.ActiveCfg = Release|Win32 {01EA6707-BDD4-4074-A5F0-CBCEB660E094}.Release|Win32.Build.0 = Release|Win32 {CC14F446-E0CF-4296-B4F4-F712D6B4DC45}.Debug|Win32.ActiveCfg = Debug|Win32 {CC14F446-E0CF-4296-B4F4-F712D6B4DC45}.Debug|Win32.Build.0 = Debug|Win32 {CC14F446-E0CF-4296-B4F4-F712D6B4DC45}.Release|Win32.ActiveCfg = Release|Win32 {CC14F446-E0CF-4296-B4F4-F712D6B4DC45}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal # 结束符
上面值得注意的是每一种设置都分为ActiveCfg和Build.0两种。