【发布时间】:2021-12-24 11:06:29
【问题描述】:
您好,我在使用 Visual Studio 2017 和 dotnet 6.0.100 时遇到了 XY 问题
我最初的问题是:“如何使用 C# 以编程方式在 MSBuild 解决方案中添加项目依赖项”
这是强制模块化应用程序在构建过程中编译 .sln 中未引用的项目以同时编译解决方案中的所有其他项目所必需的。
此.sln 文件是以编程方式构建的,并且还应在创建.sln 期间自动执行此步骤,以减少使用此.sln 的用户可能遇到的问题。
但项目的.csproj 不应被触及,因为它们是 git 子模块的一部分,不应包括对.csproj 的这些更改,而应仅包括用户对.csproj 所做的更改。
解决方案
here 和 here 使用 DTE 接口描述了一个已有 10 年历史的解决方案。
衍生问题:我未能在代码中包含正确的 EnvDTE.DTE 或 EnvDTE80.DTE2 对象引用。
我尝试添加Microsoft.VisualStudio.Setup.Configuration.Interop NuGet 包并在参考中搜索EnvDTE 或Microsoft.VisualStudio.Shell,如所见,例如在示例中here 没有运气。
原来的问题
可以按照here的描述手动添加项目依赖
我尝试通过dotnet sln命令添加项目依赖,但没有找到相应的命令来添加依赖。
dotnet sln -h 仅指向 add、list 和 remove。 add 命令没有显示依赖项选项。
由于我已经使用 dotnet 命令创建解决方案并添加项目,如果有办法,这对我来说将是一个很好的解决方案。
我尝试的另一件事是使用Microsoft.Build.Construction:
SolutionFile solutionFile = SolutionFile.Parse(PROJECT_SOLUTION_FILE.FullName);
var projectInSolution = solutionFile.ProjectsInOrder;
这确实使我能够阅读 sln 中的项目,但似乎无法操作它,因为它都是只读的。
总结
我需要一种方法来告诉解决方案,所有项目都必须在指定项目的运行/编译时进行编译。
- 为此,我需要一种方法将项目依赖项添加到 .sln 文件,方法是
- dotnet shell 命令
- 类似于 Microsoft.Build.Construction 的东西
- 或向我解释如何让 EnvDTE 代码在我的 MS Visual Studio 2017 中运行的一个很好的来源
- 或者有一些很棒的方法可以做到这一点,我还没有偶然发现
非常感谢任何帮助解决我的问题。
编辑:
澄清项目依赖与.csproj文件中的项目引用不同!
我所指的项目依赖项是.sln中的这一部分:
Project("{GUID}") = "PROJECTNAME", "CSPROJECT_LOCATION", "{GUID}"
ProjectSection(ProjectDependencies) = postProject
{GUID} = {GUID}
{GUID} = {GUID}
...
EndProjectSection
EndProject
【问题讨论】:
-
解决方案没有依赖关系...项目有。所以 dotnet sln 命令没有任何添加依赖项的选项。如果您有一个项目依赖于另一个项目,那么您可以通过 dotnet sln 命令将该项目添加到解决方案中。
-
@sommmen 解决方案文件本身似乎不是 xml 文件,您的意思是使用 SolutionFile.Parse 来获取 xml 文件吗?从理论上讲,我可以尝试手动编辑文件,但这在某种程度上是我最后的手段,我相信这是一个相当简单的解决方案的问题,我只是找不到。
-
@Chetan 您实际上可以将项目作为依赖项添加到解决方案级别上的其他项目,仅如docs.microsoft.com/en-us/visualstudio/ide/…中所述
-
@negatic 哈哈,你是对的。我想是星期五。
-
项目文件是XML,你不能在构建之前解析它并在
.csproj文件中添加依赖关系吗?
标签: c# msbuild visual-studio-2017