【发布时间】: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