原文:Solution (.Sln) File

关于VS2008和VS2010中.sln文件(解决方案文件)的介绍MSDN中只有英文版,现翻译供读者参考,希望对您有帮助。水平有限文中难免有错误,欢迎大家指正,拜谢~

解决方案就是Visual Studio中用来组织项目的结构。他的作用类似于VB6.0中的Windows程序组(.vbg)文件以及VC6.0中的项目工作区(.dsw)文件。解决方案将项目的状态信息保存在.sln文件(该文件是基于文本,而且是可共享的)和.suo文件(该文件是二进制的,而且是解决方案中可选的)中。更多关于.suo的信息请查看解决方案中用户可选.suo文件。

如果你的VSPackage由于在.sln文件中被引用而加载,那么编译环境调用ReadSolutionProps读取.sln文件。

.sln文件包含基于文本的信息,编译环境通过这些信息找到并且加载他引用到的持久数据和VSPackages项目。当用户打开解决方案的时候编译环境通过包含在.sln文件中的preSolution,Project,postSolution信息加载解决方案,包含在解决方案中的项目以及任何和解决方案有联系的持久信息。

每个项目的文件都包含额外的信息,编译环境通过读取这些信息把项目中所需的项目补充完整。数据持久层是受项目控制的;所以数据一般不包含在.sln文件中。尽管你可以有意的将项目信息写入.sln文件中。更多的信息请参考Project Persistence和Opening 和Saving Project Items。

解决方案文件内容

.sln的文件都是由几部分如图所示的下列代码构成的,他被保存在解决方案浏览器的底部。更多有关解决方案注释章节的信息,参见Extending Solution Explorer。

   1:  Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
   2:  EndProject
   3:  Global
   4:    GlobalSection(SolutionNotes) = postSolution
   5:         Name1 = Note2
   6:         Issue1 = N
   7:         Text1 = This is a shared note.
   8:         Name2 = Note3
   9:         Issue2 = N
  10:         Text2 = This is also a shared note. The second of two shared notes.
  11:         NumNotes = 2
  12:    EndGlobalSection
  13:    GlobalSection(SolutionConfiguration) = preSolution
  14:         ConfigName.0 = Debug
  15:         ConfigName.1 = Release
  16:    EndGlobalSection
  17:    GlobalSection(ProjectDependencies) = postSolution
  18:    EndGlobalSection
  19:    GlobalSection(ProjectConfiguration) = postSolution
  20:     {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|.NET
  21:     {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|.NET
  22:     {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|.NET
  23:     {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|.NET
  24:    EndGlobalSection
  25:    GlobalSection(ExtensibilityGlobals) = postSolution
  26:    EndGlobalSection
  27:    GlobalSection(ExtensibilityAddIns) = postSolution
  28:    EndGlobalSection
  29:  EndGlobal

编译环境执行如下顺序的工作去加载解决方案

1.       编译环境读取.sln文件的全局语句并且处理所有的标记为preSolution的语句。在上文的例子中,有这样的声明:

   1:    GlobalSection(SolutionConfiguration) = preSolution
   2:         ConfigName.0 = Debug
   3:         ConfigName.1 = Release

当编译环境读取到GlobalSection(‘name’)标记的时候,他通过注册表将名字映射到VSPackage中。关键字name应该在注册表的[HKLM/<Application ID Registry Root>/SolutionPersistence]目录下。关键字的默认值是写入VSPackage目录的Package GUID (REG_SZ)中的。

2.  环境加载VSPackage的时候,为IVsPersistSolutionProps接口调用VSpackage的QueryInterface,并且通过文件中的数据调用ReadSolutionProps方法,所以VSPackage能够存储数据。编译环境对每个有preSolution的地方重复做上面那样的操作。

3.  编译环境循环遍历项目的模块。那好,这里有一个项目(让我们来分析一下)

   1:  Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1",
   2:  "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
   3:  EndProject

上面这段代码中包含独一无二的项目全局唯一标识符(GUID)以及项目类型的全局唯一标识符(GUID)。这些信息被编译环境用来寻找项目文件爱你或者那些属于解决方案的文件,还有那些任何项目需要的特定的VSPackage。项目的全局唯一标识符(GUID)被传递到IVsProjectFactory用来加载和项目有关的特殊的VSPackage,然后这个项目被载入。在上面的代码中被载入的VSPackage是Visual Basic。

每个项目中都存在一个唯一的项目实例ID,只有这样这个项目才能被其他解决方案中需要他的项目使用。理想状态下,如果解决方案和项目在源代码控制之下,项目的路径应该和解决方案的路径是相关的。当解决方案被第一次加载时,项目文件不能够存在于用户的电脑中。将项目文件存放在和解决方案文件相关的服务文件中,通过这个方法将相对简单的找到项目文件或者将项目文件复制到用户的电脑中。然后编译环境复制并加载剩下的项目所需文件。

4.  根据项目的.sln文件中包含的信息编译环境加载每一个项目文件。项目本身很好的填充项目的层次而且加载任何嵌入的项目。

5.  然后编译环境执行被标记为postSolution的那些全局语句。下面就是上文代码片段中的一个例子。

   1:  GlobalSection(SolutionNotes) = postSolution
   2:         Name1 = Note2
   3:         Issue1 = N
   4:         Text1 = This is a shared note.
   5:         Name2 = Note3
   6:         Issue2 = N
   7:         Text2 = This is also a shared note. The second of two shared notes.
   8:         NumNotes = 2
   9:    EndGlobalSection

正如上面的这种情况,在.sln文件中有两个共享的note.Note1没有包含在文件中,因为他标记为不共享。他的内容放在.suo文件中。语句中的每个有名字值组成的条目和每个note是一一对应的。更多有关实现解决方案Note的内容请查看Extending Solution Explorer。

6.  最后.sln文件执行完毕,解决方案在解决方案浏览器中显示出来,并等待用户的操作。

如果有关项目的任何VSPackage加载失败, OnProjectLoadFailure方法将被调用而且每个解决方案中的项目将尝试取消在加载过程中的改变。如果解析发生错误,尽可能的收集有关解决方案文件的资料而且编译环境显示一个对话框警告这个解决方案已经被破坏了。

当解决方案被保存或者被关闭的时候QuerySaveSolutionProps方法将被调用并传到层次结构检查解决方案中是否存在那些需要保存到.sln文件中的改变。在VSQUERYSAVESLNPROPS中传递到QuerySaveSolutionProps的一个空值表明这个信息将被保存。如果值不为空表明保存的信息是特殊的项目,这取决于IVsHierarchy接口

如果有信息被保存IVsSolutionPersistence接口将被指向SaveSolutionProps的方法调用。然后WriteSolutionProps方法将被编译环境调用,这个方法用来检验与来自IPropertyBag的接口对应的名字值并且将相关信息写入.sln文件中。

为了检验来自IPropertyBag接口的信息是否被保存SaveSolutionPropsWriteSolutionProps对象被编译环境递归调用,直到所有的更改被写进.sln文件。用这种方法可以确保解决方案的信息可以保存并且下次可以顺利打开解决方案。

每个加载的VSPackage都被列举用来查看是否有需要保存到.sln文件的东西。只有在加载的时候才需要注册码。编译环境知道所有的加载的包,因为当解决方案保存的时候他们就被记录下来了。

只有.sln包含preSolution和postSolution中的条目。在.suo文件中没有相似的语句,因为解决方案需要正确的被加载。.suo文件包含用户的可选项,比如个人的注释,这些是不需要被共享或者被源码控制的。

转载于:https://www.cnblogs.com/zhangchenliang/archive/2012/08/19/2646295.html

解决方案(.sln)文件相关推荐

  1. vs2010打不开vs2017的.sln文件,出现错误提示 “选择的文件是解决方案文件 但是用此应用程序的较新版本创建的,无法打开”

    vs2010打不开vs2017的.sln文件,出现错误提示 "选择的文件是解决方案文件 但是用此应用程序的较新版本创建的,无法打开" 参考文章: (1)vs2010打不开vs201 ...

  2. 解决方案*.sln的版本,*.CSPROJ文件

    解决方案*.sln的版本 ------------------------------------------------ VS2008 为 Microsoft Visual Studio Solut ...

  3. 关于VS的解决方案sln无法设置某些工程的依赖项的问题的解决方法

    这几天在整理项目的工程文件,因为需要控制各个工程的生成次序,而VS的解决方案提供了一种"项目依赖项"的方式去控制其次序. 这个是前提,我发现有的工程死活都无法依赖其他工程,重新加进 ...

  4. 系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件

    1. 源代码(.c等)要经过编译器的编译得到目标代码(.obj),再经过链接器使目标代码和库函数及启动代码合并成一个文件,即可执行文件exe. 2. 生成可执行文件时的链接过程又可根据链接库(动态链接 ...

  5. C# 项目没有.sln文件的解决办法:

    什么是sln文件? sln文件开发中使用的解决方案文件,使用解决方案文件(后缀为sln的文件)表示一个项目组,他通常包含一个项目中所有的工程文件信息.包括文件版本,工程信息,全局设置,通过打开sln文 ...

  6. C# .NET想要另存一个项目,sln文件丢了怎么办

    如下图所示,我想要另存一个工程,把 V4.4整个的项目另存为V4.5,我可以把解决方案文件(.sln)改名字,但是我没法把文件夹改名字,改了打开sln就说找不到. 很简单的一个思路是反正sln是多余的 ...

  7. 没有sln文件怎么打开

    没有sln文件怎么用 相信这个问题应该是初学者,对.net了解不深的同学会发问的 一.很多人学习.net网站开发的时候,使用Microsoft Visual Studio工具,却没使用过IIS配置网站 ...

  8. 如何打开sln文件并显示窗口_在本机打开别人的sln文件

    sln:在开发环境中使用的解决方案文件.它将一个或多个项目的所有元素组织到单个的解决方案中.此文件存储在父项目目录中.解决方案文件,他是一个或多个.proj(项目)的集合 呵呵,今天没带书,就去网上找 ...

  9. 【UE5】打开他人的UE4/5项目没有.sln文件,打开c++文件失败

    [UE5]打开他人的UE4/5项目没有 .sln文件,打开c++文件失败 rt,下了个项目 进入项目后发现无法从虚幻引擎里打开c++文件,打开失败,进入项目文件夹查看后发现没有sln文件. 拷贝他人的 ...

  10. 如何打开sln文件并显示窗口_如何用VC 6.0 打开Sln的工程文件

    http://blog.csdn.net/zhongjling/article/details/8442173 如何用VC 6.0 打开Sln的工程文件?在解答这一问题之前,要弄清楚 DSW 文件与 ...

最新文章

  1. 学习类中的const和static类型
  2. sql select...for update是锁行还是锁表
  3. jQuery给输入框绑定键盘事件
  4. Python到底有多实用?这些功能你需要了解
  5. xstream 数字映射不上去_6个做端口映射的步骤,外网访问内网,菜鸟也能做?
  6. 用parsetInt解析数字,并求和
  7. ie浏览器怎么取消代理浏览器_微软和IE渐行渐远,IE浏览器终将成为回忆
  8. linux yum提示Loaded plugins: fastestmirror, security错误的解决方法
  9. 如何产生cpk图形_真正把Cp、Cpk、Pp、Ppk讲清楚!
  10. 6.1(数学:五角数)
  11. TotalFinder for Mac(Finder增强工具)
  12. 解决 Symantec SEP 12.1 经常扫描的问题
  13. 笔记本电脑开不了机怎么重装系统?小熊U盘重装win7系统教程
  14. MacBook Pro 屏幕黑线、条纹、线条、舞台灯、残影、横线这样的排线门问题你遇到了吗?很有可能源于官方的设计缺陷,你该何去何从?
  15. java 获取明天12点日期
  16. c语言用数字代表字母,使用c语言判断数字字母
  17. 股市币市:本周交易数据分析与最新公告
  18. VYSOR-投屏软件
  19. 卫星通信2卫星的定位
  20. 如何用SpreadJS添加背景图片和水印?

热门文章

  1. 模仿支付宝支付成功特效:svg圆圈转动+打钩
  2. windows使用命令行修改用户密码
  3. Trivy是CD流水线上面向容器的脆弱性扫描器
  4. 无人再谈“永恒牛市”
  5. 升级到Chipmunk(2021.2.1)版本 遇到Run按钮不可用
  6. IM 即时通讯系统【源码好优多】
  7. IceSword 1.18 by PJF
  8. 使用laser_filters屏蔽车架
  9. KETTLE:通过代码运行本地ktr文件
  10. php后台会员卡管理,实用PHP会员权限控制实现原理分析