如何使用 MSBuild NuGet 将 .csproj 文件加载到 .NET Core 3.0

How to Load .csproj file into .NET Core 3.0 using MSBuild NuGet

我有一个非常简单的控制台项目:

class Program
{
    static void Main(string[] args)
    {
        var project = new Project(
            "FishStory.csproj", 
            null, 
            null, 
            new ProjectCollection());

        Console.ReadLine();
    }
}

这是一个 .NET Core 3.0 控制台应用程序,它引用了 Microsoft.Build (16.4.0) NuGet 包。

找到 .csproj 文件 FishStory.csproj(我没有收到缺少 .csproj 的异常),但我确实收到以下错误。

Microsoft.Build.Exceptions.InvalidProjectFileException: 'The imported project "C:\Users\vchel\source\repos\ForDave\ForDave\bin\Debug\netcoreapp3.0\Microsoft.CSharp.targets" was not found. Confirm that the expression in the Import declaration "C:\Users\vchel\source\repos\ForDave\ForDave\bin\Debug\netcoreapp3.0\Microsoft.CSharp.targets" is correct, and that the file exists on disk. C:\Users\vchel\source\repos\ForDave\ForDave\bin\Debug\netcoreapp3.0\FishStory.csproj'

我希望如此简单的 MSBuild 测试 "just work",但我似乎遗漏了什么。我该怎么做才能加载此 .csproj 文件?

似乎 NuGet 包添加了必要的 .dll 以使用 Project 对象,但各种项目类型必须具有加载 Project .csproj 时使用的 .target 和 .props 文件。

要加载我的特定项目,我必须将以下文件添加到输出目录。我通过将文件放在我的项目中并将它们标记为 Copy if Newer.

来完成此操作

我添加了以下文件:

  • Microsoft.Common.targets
  • Microsoft.CSharp.targets
  • Microsoft.NETFramework.props
  • Microsoft.NETFramework.targets

在我的例子中,.csproj 是一个 MonoGame 项目,所以我还必须添加:

  • MonoGame.Build.Tasks.dll(不确定我是否需要这个)
  • MonoGame.common.props
  • MonoGame/v3.0/MonoGame.Content.Builder.targets

要添加这些文件以便将它们复制到输出文件夹:

  1. 将文件添加到您的项目(对于 .NET Core,您只需将文件添加到目录)
  2. 右键单击 解决方案资源管理器 和 select 属性
  3. 中的文件
  4. 复制到输出目录设置为如果更新则复制

我从以下位置提取了 targets/props/.dll 文件:

  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  • C:\Program Files (x86)\MSBuild\MonoGame\v3.0

我猜测其他项目类型(例如 Android Xamarin 项目)可能需要不同的 .targets 文件,如果使用 Visual Studio 2019 Community,可以在此处找到这些文件:

  • C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Xamarin

最后,我还不得不手动添加 NuGet 包 Microsoft.Build.Utilities.Core。不知道为什么在添加 Microsoft.Build

时没有自动添加

我在尝试加载针对 netcore31 平台的项目时遇到了同样的异常。
但之后我安装了

  • Microsoft.Build.Utilities.Core(16.5.0)
  • Microsoft.Build (16.4.0)

nuget包,没有更多的异常。项目加载成功。

也许,它会帮助更多人。