有关Visual Studio * .sln文件格式的问题

时间:2011-04-12 03:11:04

标签: visual-studio visual-studio-2008

我正在使用文本编辑器手动编辑我的* .sln文件。我对以下几行感到困惑:

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test2008", "Tools\Test2008\Test2008\Test2008.csproj", "{00B5EBB2-FDA5-4B23-BDC5-27E9F82E7C69}"
    ProjectSection(ProjectDependencies) = postProject
        {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}
    EndProjectSection
EndProject

这是什么意思

{82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}

语句?它看起来完全是多余的。

4 个答案:

答案 0 :(得分:22)

{82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}行表示Test2008项目在项目上具有声明的依赖关系(通过VStudio中的Project Dependencies对话框设置),具有唯一标识符82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8。您应该能够在相同的.sln文件中找到具有相同标识符的项目。

至于为什么行的奇怪语法,我没有.sln文件格式的内幕知识。但是,基于对.sln文件中其他ProjectSection提取的观察,我不得不猜测Visual Studio使用的.sln解析器历史上假设ProjectSection行将采用key = value格式,并且在其中强制执行密钥唯一性任何给定的部分。我还猜想那些实现项目依赖功能的人决定不使用解析器,而是将projectId = projectId用于他们的剖面线会更简单,因为密钥对他们来说没有意义,但它们是有保证的。如果只有一个从项目A到项目B的依赖项被强制执行,那么它将是唯一的。

答案 1 :(得分:13)

似乎这种冗余语法是MSBuild识别项目依赖性所需的怪癖之一:

  

似乎Visual Studio保留   依赖有两种方式,只有一种   其中的内容由MSBuild读取。我知道了   因为我还可以指定   GUI中的依赖关系,复制解决方案   其他机器和VS一起构建它   正确的顺序。    - Victor Sergienko

至于为什么这个“多余的方程式声明”是必需的,似乎将项目的guid分配给它自己的guid是MSBuild 4.0问题的一种解决方法,导致MSBuild无法识别或响应解决方案(.sln)文件中列出的某些项目依赖项,或者无序地构建依赖项。

您所询问的“{x} = {x}”语法是用于引用项目的标准MSBuild语法的变体(即@ Sergio的答案示例)。

显然,将依赖项声明嵌入到ProjectSection块中并结合自命名的依赖项GUID会导致MSBuild更改所依赖项目的构建顺序,但实际上并未向其添加另一个引用。

有一个discussion on Microsoft Connect,其中讨论了此解决方法。在其中,来自微软的Dan在页面的第二篇文章中提出了针对此MSBuild故障的更清晰的解决方法,并且还提到了您要求的修复:

  

但是,您可以创建仅[影响]构建顺序的项目引用,而无需[实际]添加[任何运行时]引用。 [将依赖 .csproj.vbproj修改为如下所示;请注意元数据元素:

<ProjectReference Include="... foo.csproj">
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
     

[...]修复了排序,因为现在LibraryProject将等待CodeGeneratingProject,但其构建将不会受到影响。我也可以通过删除解决方案文件中的依赖项来整理 - 删除这些现在不必要的行:

ProjectSection(ProjectDependencies) = postProject
    {B79CE0B0-565B-4BC5-8D28-8463A05F0EDC} = {B79CE0B0-565B-4BC5-8D28-8463A05F0EDC}
EndProjectSection
     

它仍然可以正常工作。

答案 2 :(得分:6)

来自MSDN

  

此声明包含唯一   项目GUID 和项目类型   GUID。此信息由。使用   环境找到项目文件   或属于该解决方案的文件,   并且每个都需要VSPackage   项目。

     

项目GUID传递给   IVsProjectFactory加载特定的   然后,VSPackage与项目相关   该项目由   VSPackage的。在这种情况下,VSPackage   为这个项目加载的是   Visual Basic。

例如:

  

项目( “{F184B08F-C81C-45F6-A57F-5ABD9991F28F}”)   =“Project1”,“Project1.vbproj”,“{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}”   EndProject

答案 3 :(得分:1)

ProjectSection(ProjectDependencies) = postProject之后的行 指定依赖列表 - 哪个项目取决于哪个。 (可以在解决方案&gt;属性&gt;项目依赖项中看到)。

如果你想&#34;解密&#34;更多内心发生的事情,请看下面的项目:

https://sourceforge.net/p/syncproj/code/HEAD/tree/

这是.sln解析器,您可以检查Solution.cs,搜索&#34; ProjectDependencies&#34;。

键总是与值相同,这是某种文件格式问题。