SLN文件格式

 

Visual Studio开发套装进入.net时代后,使用解决方案文件(后缀为sln的文件)表示一个项目组,他通常包含一个项目中所有的工程文件信息。了解sln文件格式,可以手动修改错误的sln文件,也可以对解析sln文件有帮助。

以下就Visual Studio .Net 2003sln文件说明其格式。

sln文件是一个文本文件,虽然它没有用最流行的XML文件表示,但数据结构却类似于XML文件,基本上也是由节组成,一个节由标记和End加标记来限定,比如说工程信息的标记为Project,那么他们由ProjectEndProject来限定。每个节可以有自己的属性,并且节内部可以再嵌套子节。子节的名称由标记加section表示,然后在名称的后面加上一个小括号,其中记录这个子节的意义,比如表示工程依赖关系的子节就是ProjectSection(ProjectDependencies)。子节也可以有属性,但是子节的属性都是由一个等式表示。

一个sln文件通常由三部分组成:

1.  文件版本。在Visual Studio .NET 2003中是这样的一句话:

Microsoft Visual Studio Solution File, Format Version 8.00

2.  工程信息

工程信息包含了解决方案中有哪些工程组成和他们之间的相互依赖关系,每个工程信息都是单独由ProjectEndProject所包括,见下面这个例子:

Project("{8BC9…C942}") = "Qb", "Qb/Qb.vcproj", "{315B…BD44}"

       ProjectSection(ProjectDependencies) = postProject

              {8503…F1D6} = {8503…F1D6}

              {B8E9…E045} = {B8E9…E045}

              {13E7…F0B6} = {13E7…F0B6}

              {F51A…9635} = {F51A…9635}

       EndProjectSection

EndProject

Project有三个属性,由逗号分成三个部分:

第一部分 ("{8BC9…C942}") = "Qb",表示工程名称,“8BC9…C942”是固定值,等号后面是工程名称。大部分情况下,工程名称和工程文件名相同。

第二部分是工程文件,它是解决方案文件的相对路径。

第三部分是工程的GUID,解决方案通过这个GUID识别工程。在后面的依赖关系和编译配置中都会用到。

工程信息中的子节用ProjectSection表示,括号内的标记ProjectDependencies表示该工程的依赖工程。这个子节的属性就是依赖工程的GUID,等式两边的GUID是相同的,有多少个依赖工程,就有多少行的GUID等式。

3.  全局设置

全局设置的标记是Global,通常对我们比较有用的子节包括SourceCodeControlSolutionConfigurationProjectConfiguration

l         SourceCodeControl记录了解决方案在SourceSafe中的信息。

首先是Scc的基本信息,通常有四行属性,如下:

SccNumberOfProjects = 6

SccLocalPath0 = .

CanCheckoutShared = true

SolutionUniqueID = {6CFC75CC-2B14-4617-B1CA-D7CDB52E9773}

注意,SccNumberOfProjects比所包含工程数多一个。

有时候,会多出两个属性SccProjectNameSccProvider,大多数时候没用,如下:

SccNumberOfProjects = 132

SccProjectName0 = /u0022$/V-Fit/u0022,/u0020YKAAAAAA

SccLocalPath0 = .

SccProvider0 = MSSCCI:Microsoft/u0020Visual/u0020SourceSafe

CanCheckoutShared = true

SolutionUniqueID = {6CFC75CC-2B14-4617-B1CA-D7CDB52E9773}

接下来,每四行都表示一个工程在SourceSafe中的信息,如下:

SccProjectUniqueName1 = Qb//Qb.vcproj

SccLocalPath1 = .

CanCheckoutShared = true

SccProjectFilePathRelativizedFromConnection1 = Qb//

注意这些属性后面都带有一个数字标记这是第几个工程属性。

有时候,会多出一个属性SccProjectName,并且SccLocalPath也不是当前路径“.”,不过这些信息都没有太多用。

SccProjectUniqueName1 = Qb//Qb.vcproj

SccProjectName1 = /u0022$Qb///u0022,/u0020IHKAAAAA

SccLocalPath1 = Qb

CanCheckoutShared = true

SccProjectFilePathRelativizedFromConnection1 = Qb//

l         SolutionConfiguration记录了解决方案可用的编译版本。比如通常能看到的:

Debug = Debug

Release = Release

l         ProjectConfiguration记录了工程可用的编译版本,对于SolutionConfiguration中指定的某些没有编译版本,则指定可替代的编译版本。比如:

{876A6148-EC66-4DD2-BC82-B61CAC2049AC}.Debug.ActiveCfg = Debug|Win32

{876A6148-EC66-4DD2-BC82-B61CAC2049AC}.Debug.Build.0 = Debug|Win32

{876A6148-EC66-4DD2-BC82-B61CAC2049AC}.Release.ActiveCfg = Release|Win32

{876A6148-EC66-4DD2-BC82-B61CAC2049AC}.Release.Build.0 = Release|Win32

 

#include <graphics.h> // 引用图形库头文件 #include <conio.h> #include<time.h> #if 0 int main1() { initgraph(640, 480); MOUSEMSG m; int r;// 创建绘图窗口,大小为 640x480 像素 while (1) { m = GetMouseMsg(); switch (m.uMsg) { case WM_MOUSEMOVE: setcolor(RGB(rand() % 91 + 10, rand() % 91 + 10, rand() % 91 + 10)); if (m.mkLButton) { circle(m.x, m.y, rand() % 91 + 10); break; } else if (m.mkRButton) { r = rand() % 91 + 10; rectangle(m.x - r, m.y - r, m.x + r, m.y + r); } } } _getch(); // 按任意键继续 closegraph(); // 关闭绘图窗口 } const int BoardW = 5; const int BoardH = 5; const int GridSz = 100; const int Edge = 30; void drawGrid() { setbkcolor(RGB(0, 162, 232));//背景颜色 cleardevice();//用当前背景颜色全涂色 setcolor(RGB(0, 0, 0));//边框用黑线 for (int i = 0; i <= BoardH; ++i) { line(Edge, Edge + i*GridSz, Edge + BoardW*GridSz, Edge + i*GridSz); } for (int i = 0; i <= BoardH; ++i) { line(Edge + i*GridSz, Edge, Edge + i*GridSz, Edge + BoardH*GridSz); } } void drawLayout(int layout[BoardH][BoardW]) { int r = GridSz * 4 / 10; int x, y; setcolor(RGB(255, 201, 14));//棋子边的颜色 setfillcolor(RGB(255, 201, 14));//棋子的填充色 for (int i = 0; i<BoardH; i++) { for (int j = 0; j<BoardW; j++) { if (1 == layout[i][j]) { x = Edge + j*GridSz + GridSz / 2; y = Edge + i*GridSz + GridSz / 2; fillcircle(x, y, r); } } } } void UpdateLayout(int Layout[BoardH][BoardW], int x, int y) { if (x <= Edge || x >= Edge + BoardW*GridSz || y <= Edge || y >= Edge + BoardH*GridSz) { return; } int i, j; i = (y - Edge) / GridSz; j = (x - Edge) / GridSz; Layout[i][j] = 1 - Layout[i][j]; if (i - 1 >= 0) { Layout[i - 1][j] = 1 - Layout[i - 1][j]; } if (i + 1 < BoardH) { Layout[i + 1][j] = 1 - Layout[i + 1][j]; } if (j - 1 >= 0) { Layout[i][j - 1] = 1 - Layout[i][j - 1]; } if (j + 1 < BoardW) { Layout[i][j + 1] = 1 - Layout[i][j + 1]; } } int isGameOver(int layout[BoardH][BoardW]) { int sum = 0; for (int i = 0; i < BoardH; i++) { for (int j = 0; j<BoardW; j++) { sum += layout[i][j]; } } if (0 == sum) { return 1; } else { return 0; } } int initLayout(int layout[BoardH][BoardW]) { int k = 0; srand((int)time(0)); for (int i = 0; i<BoardH; i++) { for (int j = 0; j<BoardW; j++) { k = rand() % 5; if (0 == k || 1 == k) { layout[i][j] = k; } } } return layout[BoardH][BoardW]; } int main() { int layout[BoardH][BoardW] = { 0 };//layout 布局 (棋盘的布局) HWND hwnd; hwnd = initgraph(BoardW*GridSz + 2 * Edge, BoardH*GridSz + 2 * Edge); while (1) { initLayout(layout); drawGrid();//画棋盘 drawLayout(layout);//画棋盘布局 MOUSEMSG m; while (!isGameOver(layout)) { m = GetMouseMsg(); switch (m.uMsg) { case WM_LBUTTONDOWN: UpdateLayout(layout, m.x, m.y); break; } drawGrid();//画棋盘 drawLayout(layout);//画棋盘布局 } MessageBox(hwnd, _T("恭喜过关!"), _T("提示"), MB_OK); } _getch(); closegraph(); return 0; } #endif //贴图 #if 0 int main() { initgraph(640, 480); IMAGE imgMask, imgSrc; loadimage(&imgMask;, _T("./mask.jpg")); loadimage(&imgSrc;, _T("./src.jpg")); putimage(100, 200, &imgMask;, SRCAND); putimage(100, 200, &imgSrc;, SRCPAINT); _getch(); closegraph(); return 0; } #endif //时间及文本显示 #if 0 int main() { initgraph(640, 480); time_t start, end; time(&start;); _getch(); time(&end;); TCHAR s[128]; _stprintf(s, _T("相隔时间:%d秒"), (end - start)); settextcolor(RGB(255, 255, 0)); settextstyle(100, 0, _T("隶书")); outtextxy(0, 0, s); _getch(); closegraph(); return 0; } #endif //声音播放 #if 0 #include"mmsystem.h" #pragma comment(lib,"winmm.lib") int main() { mciSendString(_T("open BGM.mp3 alias bgm"), NULL, 0, NULL); mciSendString(_T("open 123.mp3 123 bgm"), NULL, 0, NULL); while (1) { char key = _getch(); switch (key) { case 'p': mciSendString(_T("seek bgm to 0"), NULL, 0, NULL); mciSendString(_T("play bgm"), NULL, 0, NULL); break; //case 's': // mciSendString(_T("stop bgm"), NULL, 0, NULL); // break; case 't': mciSendString(_T("pause bgm"), NULL, 0, NULL); break; case 'r': mciSendString(_T("resume bgm"), NULL, 0, NULL); break; case 'c': goto lp; break; case 'o': mciSendString(_T("play 123"), NULL, 0, NULL); break; } } lp: mciSendString(_T("close bgm"), NULL, 0, NULL); return 0; } #endif #if 0 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL));//1970.1.1 00:00:00 for (int i = 0; i < 10; ++i) { printf("%d,", rand()); } return 0; } /* 伪随机 */ #endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值