由于程序集冲突,在非 dotnet 核心项目 (.net fx 4.6.2) 上使用 MS.Extns.DependencyInjection 和 MS.Extns.Logging 时 MSbuild 失败

MSbuild fails when Using MS.Extns.DependencyInjection and MS.Extns.Logging on non dotnet core project (.net fx 4.6.2) due to assembly conflicts

我创建了一个基于 .net fx 的 asp.net web api 2 项目,我试图在其中使用来自 Microsoft.Extensions 组件的 MS 依赖注入和 MS 日志程序集。它实际上适用于非基于 dotnet 核心的项目,提供依赖注入和带有抽象的日志框架。在本地和当我们使用 Visual studio(在我的例子中是 2017 版)时,它可以工作,根据需要部署并成功运行。

但是当我们使用 MSBUILD 时,它失败了。我有另一个 web api 2 项目,它没有使用 DI 并通过 MS.extns 登录,它构建成功。我不知道如何解决我面临的冲突。当我尝试删除冲突的程序集时,它会逐步删除要删除的注入和日志记录抽象库。

我也在我的项目中使用 EF 6。冲突始于 System.ComponentModel.Annotations。我失败的构建日志错误行如下。

都是 web api 2(非 dotnet 核心) 1. 成功构建 = .net fx 4.6.2、EF 6、使用 Unity 的 DI。 (当时没有实现日志记录) 2. 失败的构建项目 = .net fx 4.6.2,EF 6,使用 MS.Extns.DI 的 DI 和使用 MS.Extns.Logging 的日志记录。

    CSC : error CS1703: Multiple assemblies with equivalent identity have been imported: 'C:\AK\Api\PMApi\packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll' and 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\Facades\System.ComponentModel.Annotations.dll'. Remove one of the duplicate references. [C:\AK\Api\PMApi\PM.Data\PM.Data.csproj]
Done Building Project "C:\AK\Api\PMApi\PM.Data\PM.Data.csproj" (default targets) -- FAILED.
Done Building Project "C:\AK\Api\PMApi\PM.BL\PM.BL.csproj" (default targets) -- FAILED.
Done Building Project "C:\AK\Api\PMApi\PM.Api\PM.Api.csproj" (default targets) -- FAILED.
Done Building Project "C:\AK\Api\PMApi\ProjectManApi.sln" (default targets) -- FAILED.

Build FAILED.

"C:\AK\Api\PMApi\ProjectManApi.sln" (default target) (1) ->
"C:\AK\Api\PMApi\PM.Api\PM.Api.csproj" (default target) (2) ->
"C:\AK\Api\PMApi\PM.BL\PM.BL.csproj" (default target) (3) ->
"C:\AK\Api\PMApi\PM.Data\PM.Data.csproj" (default target) (4) ->
(CoreCompile target) -> 
  CSC : error CS1703: Multiple assemblies with equivalent identity have been imported: 'C:\AK\Api\PMApi\packages\System.ComponentModel.Annotations.4.5.0\lib\net461\System.ComponentModel.Annotations.dll' and 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\Facades\System.ComponentModel.Annotations.dll'. Remove one of the duplicate references. [C:\AK\Api\PMApi\PM.Data\PM.Data.csproj]

    0 Warning(s)
    1 Error(s)

请帮助我,因为我想尝试使用 MS extns 的 DI 和日志记录框架,并且它在测试和 运行 时运行良好。就 msbuild 而言,我使用它来设置持续集成,使用 Jenkins/Team 城市作为我自己的实例,我只需要 MSBUILD 到 build/test/deploy。

我需要知道这个 DI 和来自 MS.Extns 的日志记录是否不适用于非 dotnet 核心,我必须切换到使用不同的 DI 框架。因为,我已经完成了我的 api,在本地进行了测试并且一切正常。

最好是,我希望使用这些,并提供有关如何从 MSBUILD 中消除此冲突的适当建议。

更新 1: 所有 Nuget pkg 都是最新的。此外,注释上的冲突正在抛出所有项目,而不管用于 EF 的项目。当我有 nuget 给我库时,为什么 msbuild 还需要在机器驱动器中查找 Microsoft 参考程序集路径?

更新二: 冲突来自 Microsoft.Extensions.Logging - Microsoft.Extensions.Options 程序集引用 System.ComponentModel.Annotations。我认为 Nuget 版本尝试下载 4.5.1,而 Microsoft 通用程序集路径似乎有 4.6.x 或更高版本,出于某种原因,Msbuild 引用并最终发生冲突。

我在 github 中有我的解决方案,如果它值得研究问题出在哪里。 Github link 谢谢

为了它的价值,我继续使用 .net core 2.1 作为拥有我的 Web API 的解决方案。我在 .net Core 2.1 版本上创建了一个新的 web api 解决方案,从而解决了我的需求。

长话短说: .net Core 2.x Web API 解决方案带有日志框架扩展和它自己的 IOC 框架。

长篇小说: 从 .net web api 迁移到基于 .net Core 的 Web API:

时,我的个人经历有几点需要注意
  1. 装配尺寸(构建尺寸)太小了。可能是因为,.net 核心将其核心程序集作为 运行 时间程序集,因此所需的代码输出程序集变得更低。如果您安装了 .net 核心 运行time,当您想在云上发布或托管时,这可能是理想的选择。很多文档确实讨论了关于这个主题的各种选项,比如如果您不想要这个,您可以将相应的程序集与应用程序程序集一起加载。

  2. 构建和发布更简单:使用带有输出路径和配置类型参数的 dotnet 命令是最简单的开始。同样,MS 有大量关于我们如何扩展它的文档(使其更复杂、自定义驱动或使用 MSBUILD 模板),但对于大多数需要,简单的解决方案在当前平台上是负担得起的。

  3. 我们可以使用任何其他IOC,但MS自己的IOC不仅实现简单,而且与自己的核心实现绑定。我们可以使用其他 IOC 来扩展 MS 扩展,但同样,纯粹从我的角度来看,取决于我们如何使它更复杂(根据需要)但更简单的解决方案,并依赖于其他标准基础设施,因为它们与 . net 核心程序集,我们可以使用他们自己的 IOC 扩展。

  4. 日志记录 - 附带众所周知的日志记录框架,现在提供了对 .net 核心 MS 日志记录框架的扩展。我更喜欢 Nlog 和 Serilog,但它是一个开放的选择,无论哪个与 .net core MS Extensions for Logging 兼容。

  5. CORS - 如果跨 apps/domains 或混合使用,则必须以稍微不同的方式处理并精心制作。

我很乐意听到对我的观点的反馈,但再次重申,这些是我分享的个人实践经验,作为指针,我注意到从 .net Web 迁移时的独特差异 API。 (migrating/rewriting api 基础框架)