【问题标题】:How to add project dependencies in a MSBuild solution programmatically with C#如何使用 C# 以编程方式在 MSBuild 解决方案中添加项目依赖项
【发布时间】:2021-12-24 11:06:29
【问题描述】:

您好,我在使用 Visual Studio 2017 和 dotnet 6.0.100 时遇到了 XY 问题

我最初的问题是:“如何使用 C# 以编程方式在 MSBuild 解决方案中添加项目依赖项”

这是强制模块化应用程序在构建过程中编译 .sln 中未引​​用的项目以同时编译解决方案中的所有其他项目所必需的。

.sln 文件是以编程方式构建的,并且还应在创建.sln 期间自动执行此步骤,以减少使用此.sln 的用户可能遇到的问题。

但项目的.csproj 不应被触及,因为它们是 git 子模块的一部分,不应包括对.csproj 的这些更改,而应仅包括用户对.csproj 所做的更改。

解决方案

herehere 使用 DTE 接口描述了一个已有 10 年历史的解决方案。

衍生问题:我未能在代码中包含正确的 EnvDTE.DTE 或 EnvDTE80.DTE2 对象引用。 我尝试添加Microsoft.VisualStudio.Setup.Configuration.Interop NuGet 包并在参考中搜索EnvDTEMicrosoft.VisualStudio.Shell,如所见,例如在示例中here 没有运气。

原来的问题

可以按照here的描述手动添加项目依赖

我尝试通过dotnet sln命令添加项目依赖,但没有找到相应的命令来添加依赖。

dotnet sln -h 仅指向 addlistremoveadd 命令没有显示依赖项选项。

由于我已经使用 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


【解决方案1】:

我找到了解决我的 Y 问题的方法,使用 EnvDTE 添加依赖项,如 answer 中所述。

EnvDTEMicrosoft.VisualStudio.Setup.Configuration.Interop 的引用没有显示,因为我正在使用 SDK 样式 项目来测试它们,因为我们目前默认使用它们。
安装 Microsoft.VisualStudio.Setup.Configuration.Interop NuGet 也没有解决这个问题!

根据this questionSDK 样式 项目尚不支持使用 DTE 接口
这就是为什么我无法找到example 中描述的参考资料的原因。
该示例还提到了创建一个 .NET Framework 控制台应用程序,我当时并不认为这是必需的。

总结:
为了在 2021 年使用 DTE 接口,最好使用旧的项目格式,避免使用 SDK-Style 项目格式!

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2012-09-21
    • 2010-11-11
    相关资源
    最近更新 更多