【问题标题】:VS 2017 .NetCore MSBuild custom task fails to load Newtonsoft.Json or other dependentsVS 2017 .NetCore MSBuild 自定义任务无法加载 Newtonsoft.Json 或其他依赖项
【发布时间】:2018-05-15 00:39:57
【问题描述】:

环境

Visual Studio 2017

.NET 标准 2.0

.NET 框架 4.6.1

MyCustomTask.csproj 包含自定义 MS 构建任务,并具有多个目标,可为 .NET Full 和 .NET Core 运行时生成单独的 dll。

Nuget 包“Microsoft.Extensions.Configuration.Json”存在 3 级依赖关系,而后者又依赖于 Newtonsoft.Json 包。如下所示。

构建一切正常,MyCustomTask 的 Nuget 包已成功生成。

当我在目标项目上安装 MyCustomTask Nuget 包时,自定义构建任务将在 Visual Studio 2017 的 .NET Full 运行时上成功执行,但对于 .NET Core dotnet build 命令无法执行自定义构建任务...

System.IO.FileLoadException:无法加载文件或程序集 'Newtonsoft.Json,Version=10.0.0.0,Culture=neutral。

即使我打包所有依赖的 DLL 并将其放在 .netstandard 自定义任务 dll 的同一目录中,我仍然会收到相同的错误。

有什么想法可以解决这个问题吗?

【问题讨论】:

  • 我认为您需要使用 9.* 版本的 newtonsoft.json,因为 msbuild 可能已经加载了处理 nuget 资产文件所需的文件,并且 msbuild 版本中的 DLL 具有更高的优先级
  • @MartinUllrich,谢谢,但我没有提到 newtonsoft.json。我只是引用 Micorosoft.Extension.Configuration.Json 并且它依赖于 newtonsoft.json。我的理解是,对于 .NET Core 的依赖关系是从 Nuget 缓存中解决的,所以当我的 Nuget 包说需要 (>= 10.0.1) 时,为什么 MSBuild 使用的是旧版本 (9.*)?
  • msbuild 中不使用这些依赖关系解析策略。 msbuild 仅直接加载<UsingTask> 中指定的 DLL,如果找不到,则尝试从同一目录加载其他 DLL。消费包也不应该需要恢复额外的包。并且可以从没有 .net 核心依赖探测逻辑的“完整框架”msbuild (visual studio) 中使用相同的 msbuild 任务
  • 好的,我将 Newtonsoft.Jason 的显式引用添加到我的任务 dll 并将其包含在包中,以便 DLL 及其依赖项位于同一文件夹中。我仍然遇到同样的错误,您之前提到 MSBuild 版本具有更高的优先级。那我该怎么办?如何告诉 MSbuild 使用最新版本的 Newtonsoft.Json (>= 10.0.1),以便我在我的任务 dll 中使用 Micorosoft.Extension.Configuration.Json (2.0)!
  • 你可以使用github.com/AArnott/Nerdbank.MSBuildExtension来获得一个独立的任务环境

标签: msbuild json.net nuget .net-core visual-studio-2017


【解决方案1】:

在这里为遇到相同问题的人发布解决方案。

感谢 @MartinUllrich 在上面的评论中发布解决方案。这为我省去了很多麻烦。

https://github.com/AArnott/Nerdbank.MSBuildExtension

确保您的自定义任务继承自 ContextIsolatedTask,并将依赖程序集复制到与您的任务程序集相同的目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2012-09-15
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多