我正在使用文本编辑器手动编辑我的* .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}
语句?它看起来完全是多余的。
答案 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;。
键总是与值相同,这是某种文件格式问题。